Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Glassfish JAX-RS将POJO序列化为JSON失败_Java_Glassfish_Jax Rs - Fatal编程技术网

Java Glassfish JAX-RS将POJO序列化为JSON失败

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)

我用的是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(即,我更改为
@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;
    }

}