【问题标题】:Custom JSON serialization with Jersey 2.x/MOXy使用 Jersey 2.x/MOXy 自定义 JSON 序列化
【发布时间】:2014-12-18 03:51:09
【问题描述】:

我在嵌入式 Jetty 9.x 服务器内使用带有内置 MOXy 转换的 Jersey 2.xPOJO。

是否可以以编程方式(在 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 );

【问题讨论】:

    标签: moxy jersey-2.0


    【解决方案1】:

    我想你可能对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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-19
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 2014-08-02
      • 2016-09-17
      • 2014-08-20
      相关资源
      最近更新 更多