我已在JAX-RS应用程序中注册了自定义MessageBodyWriter<Object>
实现。本作者可以转换各种类型,包括字符串。
自定义转换器已成功用于其他类型,但对于字符串,CXF不会考虑它:它甚至不会调用isWriteable
。 (这在CXF 2.x中有所不同,因此CXF 3.x似乎出现了回归。)
单步执行CXF 3.1.11代码,我发现ProviderFactory.messageWriters
列表中的自定义提供程序之前有两个条目(StringTextProvider
,JAXBElementTypedProvider
)。第一个想要转换字符串,并且在列表中排在第一位,它是CXF的首选。
如何更改此设置以使我的提供程序成为字符串的首选提供程序?例如。可以放弃StringTextProvider
吗?或者是否可以重新排序列表以便我的提供者先来?
答案 0 :(得分:1)
我发现子类化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
的实现中得到了这种方法的想法,inline
检查用于排序转换器的类层次结构。