如何为CXF中的字符串提供自定义消息的作者



我在我的JAX-RS应用程序中注册了自定义MessageBodyWriter<Object>实现。该作者可以转换各种类型,包括字符串。

自定义转换器已成功用于其他类型,但是对于字符串,CXF不考虑:它甚至都不调用isWriteable。(在CXF 2.x中这是不同的,因此CXF 3.x中似乎已经回归。)

逐步浏览CXF 3.1.11代码,我在ProviderFactory.messageWriters列表中看到,在我的自定义提供商之前,有两个条目(StringTextProviderJAXBElementTypedProvider)。第一个想要转换字符串,并且是第一个列表中,它是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的实现中得出了这种方法,该方法检查了订购转换器的类层次结构。

最新更新