我在我的JAX-RS应用程序中注册了自定义MessageBodyWriter<Object>
实现。该作者可以转换各种类型,包括字符串。
自定义转换器已成功用于其他类型,但是对于字符串,CXF不考虑:它甚至都不调用isWriteable
。(在CXF 2.x中这是不同的,因此CXF 3.x中似乎已经回归。)
逐步浏览CXF 3.1.11代码,我在ProviderFactory.messageWriters
列表中看到,在我的自定义提供商之前,有两个条目(StringTextProvider
,JAXBElementTypedProvider
)。第一个想要转换字符串,并且是第一个列表中,它是CXF的首选。
如何更改此操作以使我的提供商成为字符串的首选提供商?例如。可以丢弃StringTextProvider
吗?还是可以重新排序列表,以便我的提供者第一个?
我发现子分类 StringTextProvider
并注册该类有效:
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class CustomeStringProvider extends StringTextProvider {
@Override
public void writeTo(String object, Class<?> type, Type genType, Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders, OutputStream outputStream) throws IOException {
// ...
}
}
我从查看ProviderFactory.MessageBodyWriterComparator
的实现中得出了这种方法,该方法检查了订购转换器的类层次结构。