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

How to provide a custom MessageBodyWriter for Strings in CXF

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

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

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

如何更改此设置以使我的提供程序成为字符串的首选提供程序?例如。是否可以删除 StringTextProvider?或者是否可以重新排序列表,以便我的提供者排在第一位?

我发现 subclassing StringTextProvider 和注册 class 有效:

@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 的实现得到了这种方法的想法,它检查 class 层次结构以对转换器进行排序。