moxy - 使用 Jersey 2.x/MOXy 自定义 JSON 序列化

标签 moxy jersey-2.0

我在嵌入式 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/

相关文章:

java - Jersey + Spark javax.ws.rs.core.UriBuilder.uri

apache-httpclient-4.x - Jersey Client 2 代理和多部分支持

json - JAX-RS/ Jersey : Change response body from Jackson JSON errors

java - JAXB 将多个 XML 元素解码为单个类

java - Jackson 中的 @XmlPath 模拟是什么?

spring - 在 Spring 中使用 MOXy JAXB 生成 JSON 输出

java - 将 @RolesAllowed 注释应用于数据库中存储的现有用户

jaxb - 使用 XmlElementWrapper 时编码集合

java - 使用 eclipselink MOXy 的 XmlPath 映射问题

java - 如何让 Jersey 2.6 与 Tomcat 6 和 Java 1.6 一起工作?