如何为 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
列表中在我的自定义提供程序之前有两个条目(StringTextProvider
、JAXBElementTypedProvider
)。第一个要转换字符串,而且是第一个,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 层次结构以对转换器进行排序。
我已经在我的 JAX-RS 应用程序中注册了自定义 MessageBodyWriter<Object>
实现。这个作家可以转换各种类型,包括字符串。
自定义转换器成功用于其他类型,但对于字符串,CXF 不考虑:它甚至不调用 isWriteable
。 (这在 CXF 2.x 中有所不同,因此 CXF 3.x 中似乎出现了回归。)
单步执行 CXF 3.1.11 代码,我看到 ProviderFactory.messageWriters
列表中在我的自定义提供程序之前有两个条目(StringTextProvider
、JAXBElementTypedProvider
)。第一个要转换字符串,而且是第一个,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 层次结构以对转换器进行排序。