Java Glassfish JAX-RS将POJO序列化为JSON失败
我用的是Glassfish 4.1.2 我有一个jax-rs端点,我想返回一个从POJO实体序列化的JSON对象 POJO:Java Glassfish JAX-RS将POJO序列化为JSON失败,java,glassfish,jax-rs,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)
@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(即,我更改为@products(MediaType.APPLICATION\u 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;
}
}
但是随后的所有请求都可以工作,我可以在响应中获得JSON
我有点担心它最初会失败。我无法在Glassfish 4.1.2上正常工作,我改用WildFly 10.1.0.Final,它马上就工作了 更新 回到这里,我设法让Glassfish和Jackson一起工作 似乎
java.lang.NoClassDefFoundError:com/fasterxml/jackson/module/jaxb/JaxbAnnotationIntrospector
是因为Glassfish 4.1.2没有与jackson模块jaxb annotations.jar捆绑在一起
解决方案是将jackson模块jaxb annotations.jar
添加到/glasfish4/glassfish/modules
然后使用以下命令禁用Moxy:
@应用程序路径(“”)
公共类MyServer扩展应用程序{
@凌驾
公共映射getProperties(){
Map Map=newhashmap();
put(“jersey.config.server.disableMoxyJson”,true);
返回图;
}
}
您在项目中使用了哪些JAR/依赖项?@peeskillet查看我的更新如果使用Jackson而不是默认的MOXy来处理JSON会发生什么?如果您正在为JAX-RS配置使用应用程序子类,则可以覆盖并添加一个属性,该属性的键“jersey.config.server.provider.classnames”
和值“org.glassfish.jersey.jackson.JacksonFeature”
,您也可以使用键“jersey.config.server.disableoxyjson”
和true
值。是的,我不确定是什么导致了这种情况。看起来服务器在加载类时出现问题。服务器(一个全新的服务器)应该已经有了所需的所有jar,但由于某些原因它无法加载它们。你可以试试野蝇。如果使用像tomcat这样的容器,则需要添加所有jersey依赖项,因为tomcat没有JAX-RS实现。
javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: com/fasterxml/jackson/module/jaxb/JaxbAnnotationIntrospector
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;
}
}