【问题标题】:Json deserialization issue in spring 3.2.0Spring 3.2.0 中的 Json 反序列化问题
【发布时间】:2013-01-08 06:45:11
【问题描述】:

我在使用 Spring 3.2.0 和 Jackson 2.1.1 反序列化对象数组时遇到问题。 当我点击带有对象数组的控制器时,它会抛出 “无法实例化 bean 类。未找到默认构造函数”。我的 Pojo 也有默认构造函数。我在 dispatcher-servlet 中使用 MappingJackson2HttpMessageConverter 进行 JSON 处理。

波乔:

  public class Student{

    private String rollNum;
    private String firstName;
    private String lastName;

            public Student(){

            }

    /**
     * @return the firstName
     */
    public String getFirstName() {
        return firstName;
    }
    /**
     * @param firstName the firstName to set
     */
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    /**
     * @return the lastName
     */
    public String getLastName() {
        return lastName;
    }
    /**
     * @param lastName the lastName to set
     */
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    /**
     * @return the rollNum
     */
    public String getRollNum() {
        return rollNum;
    }
    /**
     * @param rollNum the rollNum to set
     */
    public void setRollNum(String rollNum) {
        this.rollNum = rollNum;
    }
}

控制器类:

public @ResponseBody
String saveStudentName(
        final @ModelAttribute Student[] student){

      //code goes here

  }

此服务被 iOS 应用程序访问。当我用单个对象(@ModelAttribute Student student)点击相同的服务时,它工作正常。但是碰到对象数组,它会抛出异常

org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [[Lcom.student.pojo.Student;]: No default constructor found; 

客户端输入是

[{"rollNum":"12","firstName":"qweqw","lastName":"adsf"},{"rollNum":"23","firstName":"rty","lastName":"fghj"}]

并且客户端收到以下错误作为响应

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Invalid value around character 0.) UserInfo=0x7522680 {NSDebugDescription=Invalid value around character 0.}

请有人告诉我哪里错了。如果控制器参数正确,请告诉我可以发送给控制器的输入格式。

提前致谢。

【问题讨论】:

  • 你为什么不尝试在服务类中接受 List 而不是 Student[]。

标签: spring jakarta-ee spring-mvc jackson


【解决方案1】:

首先,您必须像这样围绕 Student 列表创建一个包装器:

  class Students extends ArrayList<Student> {
     public Students() {
       super();
     }
  }

还可以像这样更改服务方法:

  public @ResponseBody String saveStudentName(final @ModelAttribute Students students){

      //code goes here

  }

我想这会解决你的问题。

~拉格什AK

【讨论】:

  • 谢谢拉格什。我按照你的建议实施了。但是服务器收到的请求是 {"rollNum":"3,4" ,"firstName":"asd,asd" ,"lastName":"asas,sdasd"} 我需要像 [{"rollNum":"3 " ,"firstName":"xyz" ,"lastName":"abc"},{"rollNum":"4" ,"firstName":"abc" ,"lastName":"xyz"}] 请告诉如何实现这个。
  • 我已经尝试了来自 HTTPRequester-Firefox 插件的请求..它对我来说很好..需要将内容类型设置为 'application/json'..确保您发送数组对象而不是单个对象...在客户端确认它..尝试使用我上面提到的插件测试服务并让我知道结果..
  • 我尝试使用 HTTPRequester-Firefox 插件访问服务,但控制器接收到学生对象的空值(ex.rollNum=null)。你能告诉客户端发送对象数组的输入格式吗?
  • 我已经尝试过这样的情况:[{"name":"Ragesh","id":"101","address":"kochi"}, {"name":" Ragesh1","id":"1011","address":"kochi1"}]..
  • 在 HTTPRequester-Firefox 插件中,我使用 POST 发送与 'application/json' 相同的格式和内容类型。但是在服务器端,我的所有字段都为空。我找不到出错的地方。
【解决方案2】:
Below are the complete configs:

**My pom.xml:**


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.springframework.rest</groupId>
  <artifactId>RestWebService</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>RestWebService Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <properties>
    <spring.version>3.0.5.RELEASE</spring.version>
    <junit.version>4.11</junit.version>
    <jdk.version>1.6</jdk.version>
  </properties>
  <dependencies>
    <!--  Spring 3 dependencies -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.7</version>
        <scope>compile</scope>
    </dependency> 
    <!-- dependency>
        <groupId>org.springframework.integration</groupId>
        <artifactId>spring-integration-stream</artifactId>
        <version>2.1.3.RELEASE</version>
    </dependency -->

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>RestWebService</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.0</version>
            <configuration>
                <source>${jdk.version}</source>
                <target>${jdk.version}</target>
            </configuration>
        </plugin>
    </plugins>
  </build>  
</project>

**dispatcher-servlet.xml:**

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="com.springframework.rest" />
    <!-- To enable @RequestMapping process on type level and method level -->
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>              
                <ref bean="jsonConverter" />
            </list>
        </property>
    </bean> 

    <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes" value="application/json" />
    </bean> 
</beans>


**Student:**

public class Student {
    private String name;
    private int id;
    private String address;


    public Student() {

    }

    public Student(int id, String name, String address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }



}

**Students:**

public class Students extends ArrayList<Student> {

    public Students() {
        super();
    }

}

**Controller:**

@Controller
public class BaseController{    

    @RequestMapping(value="/student", method = RequestMethod.POST)
    @ResponseBody
    public String saveStudent(@RequestBody Students students) {
        System.out.println("Size:"+students.size());
        return "Success";
    }

}

如果这对你有帮助,请告诉我......

【讨论】:

  • 谢谢拉格什。我有你发布的配置。当我发送像 {"rollNum":"12","firstName":"abc","lastName":"pqr"} 这样的 json 请求时,控制器不会映射并将 null 分配给 pojo 中的所有字段。但是当我发送像“rollNum=12&firstName=abc&lastName=pqr”这样的请求时,它会映射到 pojo 字段。请建议我在哪里可以配置任何东西来映射 json 请求?
  • 谢谢拉格什。我用@RequestBody 实现了控制器并作为对象数组接收(Student [] student),它工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多