代码之家  ›  专栏  ›  技术社区  ›  PKey

JAX-RS(Genson+jersey):对象未转换为json

  •  0
  • PKey  · 技术社区  · 7 年前

    我有样品 rest 在上运行的应用程序 tomcat

    回复时-类型的对象 ActionError json

    操作错误 将传递给客户

    1. Array Strings 2
    2. 属于 FieldError s
    3. 专横的 Object 有效载荷

    在我的考试中,我作为一名学生通过了 payload 类型的对象 Employee

    按照上述安排,一切正常。我得到的结果是:

    {"actionErrors":["everything is ok"],"fieldErrors":null,"payload":{"empName":"Jony","empNo":"E3","position":"Manager"}}
    

    然而 ,如果我 去除 数组 属于 private ArrayList<FieldError> fieldErrors; 操作错误 现在只包含:

    1. 属于

    2. 有效载荷

    有效载荷 未正确序列化 我得到:

    {"actionErrors":["everything is ok"],"payload":"com.mycompany.mavenwebproject.model.Employee@41a8e0d9"}
    

    是什么原因造成的?有什么办法可以解决吗?

    动作错误.java

    @XmlRootElement(name = "actionError")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class ActionError<T> {
       private ArrayList<String> actionErrors;
       private ArrayList<FieldError> fieldErrors;
       private T payload;
    
        /**
         * @return the actionErrors
         */
        public ArrayList<String> getActionErrors() {
            return actionErrors;
        }
    
        /**
         * @param actionErrors the actionErrors to set
         */
        public void setActionErrors(ArrayList<String> actionErrors) {
            this.actionErrors = actionErrors;
        }
    
        /**
         * @return the fieldErrors
         */
        public ArrayList<FieldError> getFieldErrors() {
            return fieldErrors;
        }
    
        /**
         * @param fieldErrors the fieldErrors to set
         */
        public void setFieldErrors(ArrayList<FieldError> fieldErrors) {
            this.fieldErrors = fieldErrors;
        }
    
        public void addFieldError(String fieldName,String errorMessage){
             if (this.fieldErrors==null)
                 this.fieldErrors = new ArrayList<>();
             this.fieldErrors.add(new FieldError(fieldName, errorMessage));
        }
    
        public void addActionError(String errorMessage){
             if (this.actionErrors==null)
                 this.actionErrors = new ArrayList<>();
             this.actionErrors.add(errorMessage);
        }
    
        public boolean hasErrors(){
          return (fieldErrors!=null && !fieldErrors.isEmpty()) || (actionErrors!=null && !actionErrors.isEmpty());
        }
    
        /**
         * @return the payload
         */
        public T getPayload() {
            return payload;
        }
    
        /**
         * @param payload the payload to set
         * @return 
         */
        public ActionError setPayload(T payload) { //Class<T> payloadClass
            this.payload = payload;
            return this;
        }
    }
    

    @XmlRootElement(name = "fieldError")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class FieldError {
        private String fieldName;
        private String fieldError;
    
        /**
         * @return the fieldName
         */
        public String getFieldName() {
            return fieldName;
        }
    
        /**
         * @param fieldName the fieldName to set
         */
        public void setFieldName(String fieldName) {
            this.fieldName = fieldName;
        }
    
        /**
         * @return the fieldError
         */
        public String getFieldError() {
            return fieldError;
        }
    
        /**
         * @param fieldError the fieldError to set
         */
        public void setFieldError(String fieldError) {
            this.fieldError = fieldError;
        }
    
        public FieldError(String fieldName, String fieldError) {
            this.fieldName = fieldName;
            this.fieldError = fieldError;
        }
    
    
    }
    

    员工.java

    @XmlRootElement(name = "employee")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Employee {
    
        private String empNo;
        private String empName;
        private String position;
    
        // This default constructor is required if there are other constructors.
        public Employee() {
    
        }
    
        public Employee(String empNo, String empName, String position) {
            this.empNo = empNo;
            this.empName = empName;
            this.position = position;
        }
    
        public String getEmpNo() {
            return empNo;
        }
    
        public void setEmpNo(String empNo) {
            this.empNo = empNo;
        }
    
        public String getEmpName() {
            return empName;
        }
    
        public void setEmpName(String empName) {
            this.empName = empName;
        }
    
        public String getPosition() {
            return position;
        }
    
        public void setPosition(String position) {
            this.position = position;
        }
    
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   PKey    7 年前

    我在Glassfish 4.1.1和Tomcat 8上使用以下依赖项运行了上述内容:

    汤姆猫8

    <dependency>
        <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.bundles/jaxrs-ri -->
            <groupId>org.glassfish.jersey.bundles</groupId>
            <artifactId>jaxrs-ri</artifactId>
            <version>2.12</version>
            <type>zip</type>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.owlike/genson -->
        <dependency>
            <groupId>com.owlike</groupId>
            <artifactId>genson</artifactId>
            <version>1.4</version>
        </dependency>
    
        <!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.2.7</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api -->
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
    

    玻璃鱼4.1.1

     <dependency>
                <groupId>javax</groupId>
                <artifactId>javaee-web-api</artifactId>
                <version>6.0</version>
                <scope>provided</scope>
            </dependency>
      <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.bundles/jaxrs-ri -->      
    
            <dependency>
                <groupId>org.glassfish.jersey.bundles</groupId>
                <artifactId>jaxrs-ri</artifactId>
                <version>2.12</version>    
                <scope>provided</scope>
                <type>zip</type>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/com.owlike/genson -->
    
             <dependency>
                <groupId>com.owlike</groupId>
                <artifactId>genson</artifactId>
                <version>1.4</version>
            </dependency>
    
    
            <!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
            <dependency>
                <groupId>javax.xml.bind</groupId>
                <artifactId>jaxb-api</artifactId>
                <version>2.2.7</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api -->
            <dependency>
                <groupId>javax.ws.rs</groupId>
                <artifactId>javax.ws.rs-api</artifactId>
                <version>2.0.1</version>
            </dependency>
           <dependency>
                <groupId>javax</groupId>
                <artifactId>javaee-web-api</artifactId>
                <version>7.0</version>
                <scope>provided</scope>
            </dependency>
    

    也是我的 包含以下条目:

    <servlet>
            <servlet-name>jersey-serlvet</servlet-name>
            <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
            <init-param>
                 <param-name>jersey.config.server.provider.packages</param-name>
                 <param-value>com.mycompany.mavenwebproject</param-value>
            </init-param>
            <init-param>
            <param-name>jersey.config.server.provider.classnames</param-name>
            <param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>jersey-serlvet</servlet-name>
            <url-pattern>/rest/*</url-pattern>
        </servlet-mapping>
    

    还要继续跑 玻璃鱼3.1.2

    所以 pom.xml文件 依赖项如下所示:

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.8</version>
    </dependency>
    
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.8</version>
    </dependency>
    
       <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>
    

    网站.xml

    <servlet>
            <servlet-name>jersey-serlvet</servlet-name>
            <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
            <init-param>
                <param-name>com.sun.jersey.config.property.packages</param-name>
                <param-value>com.mycompany.mavenwebproject</param-value>
            </init-param>
            <init-param>
                <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
                <param-value>true</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>jersey-serlvet</servlet-name>
            <url-pattern>/rest/*</url-pattern>
        </servlet-mapping>
    

    编辑1

    为了放弃使用 genson glassfish 4.1.1 丢失的图书馆 jackson-module-jaxb-annotations-2.5.4.jar 应添加到Glassfish模块目录。 否则

    java.lang.ClassNotFoundException类:
    找不到com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector

    将被抛出。 但是,如果添加上述罐子,那么玻璃鱼的pom可能如下所示:

    Glassfish 4.1.1(修复了缺少的库错误)

    <dependencies>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>2.3.2</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax</groupId>
                <artifactId>javaee-web-api</artifactId>
                <version>6.0</version>
                <scope>provided</scope>
            </dependency>
      <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.bundles/jaxrs-ri -->      
    
            <dependency>
                <groupId>org.glassfish.jersey.bundles</groupId>
                <artifactId>jaxrs-ri</artifactId>
                <version>2.12</version>    
                <scope>provided</scope>
                <type>zip</type>
            </dependency>
    
    
            <!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
            <dependency>
                <groupId>javax.xml.bind</groupId>
                <artifactId>jaxb-api</artifactId>
                <version>2.2.7</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api -->
            <dependency>
                <groupId>javax.ws.rs</groupId>
                <artifactId>javax.ws.rs-api</artifactId>
                <version>2.0.1</version>
            </dependency>
    
            <dependency>
                <groupId>javax</groupId>
                <artifactId>javaee-web-api</artifactId>
                <version>7.0</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    

    编辑2。

    配置正常

    pom.xml文件

      <dependencies>
            <dependency>
                <groupId>javax</groupId>
                <artifactId>javaee-web-api</artifactId>
                <version>6.0</version>
                <scope>provided</scope>
            </dependency>
      <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.8</version>
    </dependency>
    
    <!-- removed to use jackson 2 not 1
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.8</version>
    </dependency>
    -->
    
    <!-- jackson 2 json provider  -->
    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.2.3</version>
    </dependency>
    
    <!-- jackson 2 xml provider 
    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-xml-provider</artifactId>
        <version>2.2.3</version>
    </dependency>
    -->
    <dependency>
        <groupId>com.sun.jersey.contribs</groupId>
        <artifactId>jersey-multipart</artifactId>
        <version>1.8</version>
    </dependency>
       <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
        </dependency>
          <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>2.3.2</version> <!-- unlike jersey 2 on glassfish 4.1.1 here it is not provided! -->
           </dependency>
    
        </dependencies>
    

    以及 变成

    <servlet>
            <servlet-name>jersey-serlvet</servlet-name>
            <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
            <init-param>
                <param-name>com.sun.jersey.config.property.packages</param-name>
                <param-value>
                                         com.mycompany.mavenwebproject
                                        <!--
                                        Jackson 2.x JAX-RS @Providers
                                        -->
                                         com.fasterxml.jackson.jaxrs.json <!--JSON -->
                                         <!-- com.fasterxml.jackson.jaxrs.xml  -->  <!-- XML -->
                            </param-value>
            </init-param>
            <init-param>
                <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
                <param-value>true</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>jersey-serlvet</servlet-name>
            <url-pattern>/rest/*</url-pattern>
        </servlet-mapping>
    
    推荐文章