如何在CXF中为字符串提供自定义MessageBodyWriter

时间:2017-12-13 10:49:57

标签: jax-rs cxf

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

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

单步执行CXF 3.1.11代码,我发现ProviderFactory.messageWriters列表中的自定义提供程序之前有两个条目(StringTextProviderJAXBElementTypedProvider)。第一个想要转换字符串,并且在列表中排在第一位,它是CXF的首选。

如何更改此设置以使我的提供程序成为字符串的首选提供程序?例如。可以放弃StringTextProvider吗?或者是否可以重新排序列表以便我的提供者先来?

1 个答案:

答案 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检查用于排序转换器的类层次结构。