【发布时间】:2017-06-27 23:51:44
【问题描述】:
我使用的是 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
但是所有后续请求都可以正常工作,我可以在响应中获取 JSON。
我有点担心它最初会失败。
【问题讨论】:
-
您的项目使用了哪些 jars/依赖项?
-
@peeskillet 查看我的更新
-
如果你使用 Jackson 而不是默认的 MOXy 处理 JSON 会发生什么?如果您在 JAX-RS 配置中使用
Application子类,请覆盖 getProperties 并添加带有键"jersey.config.server.provider.classnames"和值"org.glassfish.jersey.jackson.JacksonFeature"的属性 -
你也可以使用键
"jersey.config.server.disableMoxyJson"和true值。 -
是的,我不确定是什么原因造成的。看起来服务器在加载类时遇到问题。服务器(一个全新的)应该已经拥有所有需要的 jar,但由于某种原因它无法加载它们。你可以试试 Wildfly。如果您使用像 tomcat 这样的容器,则需要添加所有球衣依赖项,因为 tomcat 不会有 JAX-RS 实现。