Glassfish的JAX-RS连载POJO以JSON失败

问题描述:

我使用Glassfish的4.1.2Glassfish的JAX-RS连载POJO以JSON失败

我有一个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。

UPDATE

我的项目的依赖关系是:

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

加入jersey.config.server.disableMoxyJson, true到应用程序属性映射在从@peeskillet建议做那种工作:

@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 

但后来所有的请求都能正常工作,并且我可以在休止状态下获得JSON。

虽然它最初失败,但我有点担心。

+0

您使用的为您的项目是什么罐子/依赖性? –

+0

@peeskillet查看我的更新 – Neilos

+1

如果您使用Jackson,而不是默认的MOXy进行JSON处理,会发生什么?如果您为JAX-RS配置使用'Application'子类,请覆盖[getProperties](http://docs.oracle.com/javaee/7/api/javax/ws/rs/core/Application.html#getProperties - )并添加一个属性,其中键为“jersey.config.server.provider.classnames”,值为“org.glassfish.jersey.jackson.JacksonFeature”' –

我无法使用Glassfish 4.1.2正确地工作,我切换到使用WildFly 10.1.0.Final,它马上就能正常工作。

UPDATE

说回这个我设法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

使用,然后停用莫西:

@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; 
    } 

}