Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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 如何使用Jersey JSON POJO支持?_Java_Json_Rest_Jakarta Ee_Jersey - Fatal编程技术网

Java 如何使用Jersey JSON POJO支持?

Java 如何使用Jersey JSON POJO支持?,java,json,rest,jakarta-ee,jersey,Java,Json,Rest,Jakarta Ee,Jersey,我想在JSON中提供一个对象作为RESTful资源。我已经像这样打开了Jersey的JSON POJO支持(在web.xml中): 我试图服务的类并不复杂,它所拥有的只是一些公共的final字段和一个设置所有字段的构造函数。这些字段都是字符串、原语、类似于此字段的类或其列表(我尝试使用普通列表而不是泛型列表,但没有效果)。有人知道什么给你吗?谢谢 Java EE 6 泽西1.1.5 GlassFish 3.0.1为什么要使用final字段? 我正在使用jersey,我有一些JAXB对象/POJO

我想在JSON中提供一个对象作为RESTful资源。我已经像这样打开了Jersey的JSON POJO支持(在web.xml中):

我试图服务的类并不复杂,它所拥有的只是一些公共的final字段和一个设置所有字段的构造函数。这些字段都是字符串、原语、类似于此字段的类或其列表(我尝试使用普通列表而不是泛型列表,但没有效果)。有人知道什么给你吗?谢谢

Java EE 6

泽西1.1.5


GlassFish 3.0.1

为什么要使用final字段? 我正在使用jersey,我有一些JAXB对象/POJO,我所要做的只是用@products(“application/json”)注释我的资源方法,它可以开箱即用。我不必弄乱web.xml。只需确保POJO的注释正确即可

下面是一个简单的pojo

package test;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class SampleJaxbObject {

    private String field1;

    private Integer field2;

    private String field3;

    public String getField1() {
        return field1;
    }

    public void setField1(String field1) {
        this.field1 = field1;
    }

    public Integer getField2() {
        return field2;
    }

    public void setField2(Integer field2) {
        this.field2 = field2;
    }

    public String getField3() {
        return field3;
    }

    public void setField3(String field3) {
        this.field3 = field3;
    }


}

Jersey json有一个JAXB实现。您得到该异常的原因是因为您没有注册的,或者更具体地说,没有。您需要在提供商中注册适当的上下文:

@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
    private final static String ENTITY_PACKAGE = "package.goes.here";
    private final static JAXBContext context;
    static {
        try {
            context = new JAXBContextAdapter(new JSONJAXBContext(JSONConfiguration.mapped().rootUnwrapping(false).build(), ENTITY_PACKAGE));
        } catch (final JAXBException ex) {
            throw new IllegalStateException("Could not resolve JAXBContext.", ex);
        }
    }

    public JAXBContext getContext(final Class<?> type) {
        try {
            if (type.getPackage().getName().contains(ENTITY_PACKAGE)) {
                return context;
            }
        } catch (final Exception ex) {
            // trap, just return null
        }
        return null;
    }

    public static final class JAXBContextAdapter extends JAXBContext {
        private final JAXBContext context;

        public JAXBContextAdapter(final JAXBContext context) {
            this.context = context;
        }

        @Override
        public Marshaller createMarshaller() {
            Marshaller marshaller = null;
            try {
                marshaller = context.createMarshaller();
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            } catch (final PropertyException pe) {
                return marshaller;
            } catch (final JAXBException jbe) {
                return null;
            }
            return marshaller;
        }

        @Override
        public Unmarshaller createUnmarshaller() throws JAXBException {
            final Unmarshaller unmarshaller = context.createUnmarshaller();
            unmarshaller.setEventHandler(new DefaultValidationEventHandler());
            return unmarshaller;
        }

        @Override
        public Validator createValidator() throws JAXBException {
            return context.createValidator();
        }
    }
}
然后在同一个包中创建ObjectFactory:

@XmlRegistry
public class ObjectFactory {
   public Person createNewPerson() {
      return new Person();
   }
}
注册了
@Provider
后,Jersey将为您的资源编组提供便利:

@GET
@Consumes(MediaType.APPLICATION_JSON)
public Response doWork(Person person) {
   // do work
   return Response.ok().build();
}

我遵循了说明如何使用Jersey和Jackson POJOs(与JAXB相反)。泽西1.12也适用

我是新手,但在将jackson-all-1.9.0.jar添加到类路径后,我能够使用pojo。

如果您想使用JAXB注释,可以使用
@XmlRootElement
(参见其他答案)

但是,如果您更喜欢纯POJO映射,则必须执行以下操作(遗憾的是,它不是在文档中编写的):

  • 将jackson*.jar添加到类路径中(如@Vitali Bichov所述)
  • 在web.xml中,如果您正在使用
    com.sun.jersey.config.property.packages
    init参数,请将
    org.codehaus.jackson.jaxrs
    添加到列表中。这将在Jersey的扫描列表中包括JSON提供程序

  • 您可能已经了解了这一点,但您需要做的只是将这些jackson JAR添加到您的类路径中:jackson core、jackson JAXR、jackson mapper和jackson xc

    正如其他人指出的那样,似乎还有另一种方法。将此添加到“com.sun.jersey.config.property.packages”参数(如果使用tomcat和web.xml):“org.codehaus.jackson.jaxrs”,如下所示:

    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>org.codehaus.jackson.jaxrs</param- value>
    </init-param>
    
    
    com.sun.jersey.config.property.packages
    org.codehaus.jackson.jaxrs
    

    要做到这一点,还需要在类路径上使用相同的jackson JAR。Jersey 2.0使用MOXy an jackson提供对JSON的支持

    如果JAR存在于类路径中,那么默认情况下会启用MOXy支持,并且可以使用特性启用Jackson支持。Jersey 2.0用户指南中关于JSON绑定的章节对此进行了详细说明:

    要在不需要配置的情况下添加MOXy支持,请向maven
    pom.xml添加以下依赖项

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-moxy</artifactId>
        <version>2.6</version>
    </dependency>
    
    
    org.glassfish.jersey.media
    泽西媒体公司
    2.6
    
    这为我做到了-Jersey 2.3.1

    在web.xml文件中:

    <servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value><my webapp packages>;org.codehaus.jackson.jaxrs</param-value>
    </init-param>
    </servlet>
    
    <dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.3.1</version>
    </dependency>
    
    
    Jersey Web应用程序
    org.glassfish.jersey.servlet.ServletContainer
    jersey.config.server.provider.packages
    ;org.codehaus.jackson.jaxrs
    
    在pom.xml文件中:

    <servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value><my webapp packages>;org.codehaus.jackson.jaxrs</param-value>
    </init-param>
    </servlet>
    
    <dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.3.1</version>
    </dependency>
    
    
    org.glassfish.jersey.media
    泽西媒体公司
    2.3.1
    
    以下内容对我很有用。我使用的是运行在Tomcat6上的ApacheFelix(OSGi)

    public class MyApplication extends ResourceConfig {
    
        public MyApplication() {
            super(JacksonFeature.class);
            // point to packages containing your resources
            packages(getClass().getPackage().getName());
        }
    }
    
    然后,在
    web.xml
    (或者在我的例子中,只是一个
    哈希表
    )中,您可以像这样指定
    javax.ws.rs.Application

    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value><MyApplication.class.getName()></param-value>
    </init-param>
    

    jersey-json
    依赖项移到pom.xml的顶部,为我解决了这个问题

    <dependencies>
      <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.18.1</version>
      </dependency>
    
      <!-- other dependencies -->
    
    </dependencies>
    
    
    泽西岛
    泽西json
    1.18.1
    
    这在Jersey 2.30中有效:

    pom.xml
    中:

    
    org.glassfish.jersey.media
    泽西媒体公司
    2.30
    
    WEB-INF/WEB.xml
    中:

    
    我的球衣休息服务
    org.glassfish.jersey.servlet.ServletContainer
    1.
    jersey.config.server.provider.classnames
    org.glassfish.jersey.jackson.JacksonFeature
    jersey.config.server.provider.packages
    com.example.myapp
    
    谢谢!我已经能够让它与JAXB一起工作,但我特别寻找Jersey POJO编写,而不是JAXB编写。有最终字段会干扰吗?我有最终字段,因为它们代表对象的不可变属性。谢谢!看起来我误解了Jersey JSON/POJO的工作原理。请记住,这个答案对于Jersey的v1.18版不再有效。您不需要编写自己的MessageBodyWriter,@GET方法的返回类型可以是POJO-objects.FYI,如果使用maven,这将为您引入:
    com.sun.jersey json 1.8
    Seconding@Nilzor-很好的问题,但这不再是最好的答案。是的,下面加下划线,如果你今天遇到这个问题,你的问题很可能是一个类路径问题,正如在这里的其他答案中提到的。在jersey的v1.12中,json没有POJOMappingFeature类。我们是否需要添加任何额外的jar,或者需要为最新版本的Jersey更改配置。在泽西岛官方网站()上,文档似乎很旧。请指导我,因为我不想在POJO中添加不必要的JAXB注释@XMLRootElement。谢谢。这是我的解决方案。很好。。。我完全忘了在我的项目中将@XmlRootElement添加到类中。谢谢天哪,谢谢。神奇的额外扫描包为我修复了它。我关注了所有其他关于类路径和手动提供者注册的相关帖子。再次感谢。这对我很有效,只需更正一点,参数名称必须是com.sun.jersey.config.property.packagesI从
    Maven
    添加
    jersey媒体json jackson
    。信息技术
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.7</version>
    </dependency>
    
    <dependencies>
      <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.18.1</version>
      </dependency>
    
      <!-- other dependencies -->
    
    </dependencies>