我在嵌入式 Jetty 9.x 服务器内使用 Jersey 2.x 和内置的 MOXy 转换从 JSON<-->POJO。
是否可以以编程方式(在 POJO 上没有注释)为特定类型(例如 Joda DateTime)定义自定义 JSON(反)序列化例程 - 如果是,如何?
目前,我有以下代码用于使用我的嵌入式 Jetty 服务器实例配置 Jersey:
ResourceConfig resourceConfig = new ResourceConfig();
resourceConfig.packages( "com.company.app.rest.v1" );
resourceConfig.register( new GZipEncoder() );
resourceConfig.register( new LoggingFilter() );
ServletHolder servletHolder = new ServletHolder( new ServletContainer( resourceConfig ) );
context.addServlet( servletHolder, "/rest/v1/*" );
并且它对于简单的 POJO 工作正常 - 我只想能够自定义(反)序列化。有没有办法为特定类型插入转换器,如下所示:
registerTypeConverter( MySpecificType.class, CustomReader.class, CustomWriter.class );
最佳答案
我想您可能对 this wiki article 感兴趣.其中大部分处理 XML 序列化,但在底部您将找到如何自定义 JSON 序列化。
基本上你创建一个自定义 ContextResolver<JAXBContext>
返回自定义 JSONJAXBContext
反过来有一个自定义 JSONConfiguration
.不要忘记用 @Provider
注释它(如有必要,请在您的应用程序中注册它)。为了完整起见,我将复制示例代码,你永远不知道这些东西能存活多久:)
@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
private JAXBContext context;
private Class[] types = { Address.class, Customer.class, CustomerResource.class };
public JAXBContextResolver() throws Exception {
this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), types);
}
public JAXBContext getContext(Class<?> objectType) {
for (Class type : types) {
if (type == objectType) {
return context;
}
}
return null;
}
}
关于moxy - 使用 Jersey 2.x/MOXy 自定义 JSON 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26511816/