Glassfish JAX-RS序列化POJO到JSON失败

时间:2017-06-27 23:51:44

标签: java glassfish jax-rs

我正在使用Glassfish 4.1.2

我有一个jax-rs端点,我想从我的POJO实体返回一个序列化的JSON对象。

POJO:

@XmlRootElement
public class MyObj {

    public MyObj() {}

    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

}

资源:

@Path("/something")
public class MyResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public MyObj getMyObject() {
        MyObj myObj = new MyObj();
        myObj.setValue("Some Value");
        return myObj;
    }

}

产生两个异常,第一个在服务器启动后首次访问资源时抛出:

javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: javax/xml/parsers/ParserConfigurationException

所有后续请求都会产生异常:

javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: Could not initialize class org.eclipse.persistence.jaxb.BeanValidationHelper

但是,如果我将结果作为XML(即我更改为@Produces(MediaType.APPLICATION_XML)),它的工作无异常,并且返回的xml没有问题。

我的请求标头同时接受xml和json。

更新

我的项目依赖项是:

javax:javaee-api:7.0
com.lambdaworks:scrypt:1.4.0
commons-codec:commons-codec:1.10
org.apache.commons:commons-lang3:3.6

我基本上把这个项目剥夺了它的骨头。

更新2

根据@peeskillet的建议,将jersey.config.server.disableMoxyJson, true添加到应用程序属性映射中可以起到一定的作用:

@ApplicationPath("")
public class MyServer extends Application {

    @Override
    public Map<String, Object> getProperties() {
        Map<String, Object> map = new HashMap<>();
        map.put("jersey.config.server.disableMoxyJson", true);
        return map;
    }

}

初始请求失败,并显示:

javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: com/fasterxml/jackson/module/jaxb/JaxbAnnotationIntrospector

然后所有后续请求都能正常工作,我可以在respose中获取JSON。

我有点担心它最初失败了。

1 个答案:

答案 0 :(得分:0)

我无法使用Glassfish 4.1.2正常工作,我转而使用WildFly 10.1.0.Final,它立刻就可以使用。

<强>更新

回到过去,我设法让Glassfish与杰克逊合作。

似乎java.lang.NoClassDefFoundError: com/fasterxml/jackson/module/jaxb/JaxbAnnotationIntrospector是因为Glassfish 4.1.2没有捆绑jackson-module-jaxb-annotations.jar

解决方案是将jackson-module-jaxb-annotations.jar添加到<glassfish install>/glasfish4/glassfish/modules

然后使用以下方法禁用Moxy:

@ApplicationPath(&#34;&#34)

public class MyServer extends Application {

    @Override
    public Map<String, Object> getProperties() {
        Map<String, Object> map = new HashMap<>();
        map.put("jersey.config.server.disableMoxyJson", true);
        return map;
    }

}