2013-01-08 75 views
0

我在使用Spring 3.2.0和Jackson 2.1.1反序列化對象數組時遇到問題。 當我點擊控制器與對象數組它拋出「無法實例化bean類。沒有默認構造函數找到」。我的Pojo也有默認的構造函數。我正在使用MappingJackson2HttpMessageConverter在調度程序 - 小服務程序中進行JSON處理。春季Json反序列化問題3.2.0

POJO的:

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學生)打相同的服務時,它工作正常。但是,隨着對象的數組擊中,它會拋出異常,因爲

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.} 

請一些人告訴在哪裏錯了。如果控制器參數正確,請告訴我可以發送給控制器的輸入格式。

在此先感謝。

+0

你爲什麼不嘗試接受服務類的學生,而不是[]列出。 –

回答

0

首先,你必須圍繞學生的這樣的列表中創建一個包裝:

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

也改變了服務方式是這樣的:

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

     //code goes here 

    } 

我想這將解決您的問題。

〜Ragesh AK

+0

謝謝Ragesh。我按照你的建議執行。但服務器收到請求爲 {「rollNum」:「3,4」,「firstName」:「asd,asd」,「lastName」:「asas,sdasd」} 我需要收到像 [{「rollNum」 :「3」,「firstName」:「xyz」,「lastName」:「abc」},{「rollNum」:「4」,「firstName」:「abc」,「lastName」:「xyz」}] 告訴如何實現這一點。 – pmbthiru

+0

我已經嘗試了HTTPRequester-Firefox插件的請求。它對我很好。需要將content-type設置爲'application/json'。確保你發送的是對象數組而不是單個對象...在客戶端進行確認..嘗試使用上面提到的插件測試服務,並讓我知道結果。 – RageshAK

+0

我嘗試使用HTTPRequester-Firefox插件訪問服務,但控制器接收爲空值學生對象(ex.rollNum = null)。你能告訴客戶端發送數組的對象的輸入格式嗎? – pmbthiru

0
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"; 
    } 

} 

請讓我知道如果這能幫助你....

+0

謝謝Ragesh。我擁有你發佈的配置。當我發送類似於{「rollNum」:「12」,「firstName」:「abc」,「lastName」:「pqr」}的json請求時,控制器不映射並將null分配給pojo中的所有字段。但是當我發送像「rollNum = 12&firstName = abc&lastName = pqr」的請求時,它會映射到pojo字段。請建議我在哪裏可以配置任何映射json請求? – pmbthiru

+0

謝謝你Ragesh。我用@RequestBody實現了控制器,並以對象數組(Student [] student)的形式接收數據,它工作正常。 – pmbthiru

+0

歡迎...如果我的回答有幫助,請爲我的答案投票.. :) – RageshAK