【发布时间】:2014-08-27 13:49:11
【问题描述】:
我需要在 GlassFish 4.0 中自定义 JAX-RS 的 JSON 输出。自定义 MessageBodyWriter 似乎很合适。我的问题是我不能举任何例子,例如http://blog.bdoughan.com/2012/05/moxy-as-your-jax-rs-json-provider.html,由服务器调用。我只是设置断点以查看它是否被命中。我知道它在正确的包中,等等,因为我也尝试了自定义 WriterInterceptor 并且那个被击中就好了。我只需要将 @Provider 放在正确包中的 WriterInterceptor 上即可。
到目前为止我尝试过的事情:
- 只需使用@Provider
- 修改 web.xml 并使用自定义应用程序注册自定义 MOXyJsonProvider。应用程序类被调用,但 MessageBodyWriter/MOXyJsonProvider 未被调用。
- 添加 META-INF/services/javax.ws.rs.ext.MessageBodyWriter 文件,其中包含类名
代码如下:
@Provider
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class WebVisualizationJsonWriter extends MOXyJsonProvider {
@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return WebVisualizationJsonPayload.class == type
|| WebVisualizationJsonPayload.class == getDomainClass(genericType);
}
@Override
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return isReadable(type, genericType, annotations, mediaType);
}
@Override
protected void preReadFrom(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, String> httpHeaders, Unmarshaller unmarshaller) throws JAXBException {
unmarshaller.setProperty(MarshallerProperties.JSON_VALUE_WRAPPER, "$");
}
@Override
protected void preWriteTo(Object object, Class<?> type, Type genericType, Annotation[] annotations,
MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, Marshaller marshaller)
throws JAXBException {
marshaller.setProperty(MarshallerProperties.JSON_VALUE_WRAPPER, "$");
}
}
在 RESTful 服务调用期间,上述方法均未命中。
【问题讨论】:
-
从调试中得出的结论是,问题在于,根据jersey.java.net/documentation/latest/…描述的算法,Jersey的
ConfigurableMoxyJsonProvider总是会被优先选择,除非你写了MessageBodyWriter/@987654326使用比Object更具体的类型参数化的@。但是如果你这样做,你就不能再扩展 MOXy 的 MOXyJsonProvider 了,因为它实现了 MessageBodyWriter -
对我来说,设计缺陷似乎是
ConfigurableMoxyJsonProvider有效地使您列出的四种方法无法自定义。应该有办法用自定义子类替换ConfigurableMoxyJsonProvider的默认注册实例。
标签: json rest glassfish jax-rs jersey-2.0