【问题标题】:Glassfish JAX-RS serialising POJO to JSON failsGlassfish JAX-RS 将 POJO 序列化为 JSON 失败
【发布时间】: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 实现。

标签: java glassfish jax-rs


【解决方案1】:

我无法让 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-module-jaxb-annotations.jar 捆绑在一起。

解决方法是将jackson-module-jaxb-annotations.jar添加到&lt;glassfish install&gt;/glasfish4/glassfish/modules

然后使用以下命令禁用 Moxy:

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

}

【讨论】:

    猜你喜欢
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 2019-10-09
    • 2015-05-25
    • 2017-08-09
    • 2021-11-22
    相关资源
    最近更新 更多