2013-07-11 54 views
0

並且再次出現了一個轉化爲Sring,MVC和Hibernate的問題。我嘗試了所有可能的解決方案。但沒有解決我的問題。Spring + MVC + Hibernate:無法讀取我的請求Body

我想做什麼: 添加一個新的進入我的SQL數據庫通過發送一個PUT請求到我的服務器有一個JSON對象。

什麼工作: 我的服務器工作正常,所有的GET請求做什麼,他們都應該。 也是我的數據庫識別,並增加了新的條目,但是,所有的屬性都爲空

我的設置: 數據庫:SQL(與XAMPP生成) 服務器:春天,MVC,Hibernate的

這裏有我的文件(請注意,我已經inluded的JacksonMapper)

的applicationContext-servlet.xml中

<context:component-scan base-package="ma" /> 

<mvc:annotation-driven /> 

<tx:annotation-driven /> 

<!-- Hibernate Integration --> 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/travelpal" /> 
    <property name="username" value="root" /> 
    <property name="password" value="" /> 
</bean> 

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"></property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
     </props> 
    </property> 
    <property name="packagesToScan" value="ma" /> 
</bean> 

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
    p:sessionFactory-ref="sessionFactory"> 
</bean> 

<!-- Added to support JSON PUT --> 
<bean id="jsonConverter" 
    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
    <property name="prefixJson" value="false" /> 
    <property name="supportedMediaTypes" value="application/json" /> 
</bean> 

我試圖添加這個部分,因爲它出現在很多答案中,但Spring不允許我添加它。它始終顯示錯誤,指出 「構建路徑是不完整的。無法找到的javax/servlet的/的ServletException類文件」

<bean id="annotationHandlerAdapter" 
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" > 
<property name="order" value="1" /> 
    <property name="messageConverters"> 
    <list> 
     <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" > 

      <property name="supportedMediaTypes" value="application/json"/> 
     </bean> 
     <bean class = "org.springframework.http.converter.StringHttpMessageConverter"> 
      <property name="supportedMediaTypes" value = "text/plain;charset=UTF-8" /> 
     </bean> 
    </list> 
</property> 

我的pom.xml

<dependencies> 
    <!-- Spring 3 dependencies --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <version>3.1.1.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>3.1.1.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>3.1.1.RELEASE</version> 
    </dependency> 

    <!-- Jackson JSON Mapper --> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.12</version> 
    </dependency> 

    <!-- Hibernate Integration START --> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>3.2.0.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>4.1.9.Final</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-tx</artifactId> 
     <version>3.1.2.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>commons-dbcp</groupId> 
     <artifactId>commons-dbcp</artifactId> 
     <version>1.2.2</version> 
    </dependency> 

    <!-- Testint added --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-dao</artifactId> 
     <version>2.0.8</version> 
    </dependency> 

</dependencies> 



<build> 
    <sourceDirectory>src</sourceDirectory> 
    <plugins> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.0</version> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
     </plugin> 
     <plugin> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.3</version> 
      <configuration> 
       <warSourceDirectory>WebContent</warSourceDirectory> 
       <failOnMissingWebXml>false</failOnMissingWebXml> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

我的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
id="WebApp_ID" version="3.0"> 
<display-name>TravelPalServer</display-name> 
<welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    <welcome-file>index.htm</welcome-file> 
    <welcome-file>index.jsp</welcome-file> 
    <welcome-file>default.html</welcome-file> 
    <welcome-file>default.htm</welcome-file> 
    <welcome-file>default.jsp</welcome-file> 
</welcome-file-list> 


<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext-servlet.xml</param-value> 
</context-param> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<servlet> 
    <servlet-name>applicationContext</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>applicationContext</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<!-- Added for JSON PUT --> 
<filter> 
    <filter-name>httpMethodFilter</filter-name> 
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>httpMethodFilter</filter-name> 
    <servlet-name>applicationContext</servlet-name> 
</filter-mapping> 

我PalDAO(節選)

@Override 
public void insertPal(Pal pal) { 
    System.out.println("Inserting Pal: " + pal.getName()); 
    sessionFactory.getCurrentSession().save(pal); 
} 

pal.getName()返回NULL

的PalController

@RequestMapping(value="/", method = RequestMethod.PUT) 
public @ResponseBody Pal insertPal(@ModelAttribute Pal person) { 
    System.out.println("Im Controller; adding Pal: " + person.getName()); 
    palService.insertPal(person); 
    return person; 
} 

在這裏,我也試過@RequestBody,但是則響應說: 「......回答是語法不正確」 此外,person.getName()返回NULL

Pal.java

@Entity 
@Table(name="Pal") 
public class Pal { 

@Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="ID", nullable = false) 
private Long id; 

@Column(name="name", nullable = true) 
private String name; 

@Column(name="age", nullable = false) 
private int age; 

@Column(name="gender", nullable = false) 
private String gender; 

@ManyToOne 
@JoinColumn(name="locationId") 
private Location locationId; 

@ManyToOne 
@JoinColumn(name="settingId") 
private Settings settingId; 


public Pal() {} 

public Pal(Long id, String name, String gender, Location locationId, Settings setting) { 
    super(); 
    this.id = id; 
    this.name = name; 
    this.gender = gender; 
    this.locationId = locationId; 
    this.settingId = setting; 
} 

public Pal(Long id, String name, int alter) { 
    super(); 
    this.id = id; 
    this.name = name; 
    this.age = alter; 
} 

public Pal(String name, int alter) { 
    super(); 
    this.name = name; 
    this.age = alter; 
} 

public Pal(String name, int age, String gender) { 
    super(); 
    this.name = name; 
    this.age = age; 
    this.gender = gender; 
} 

public Pal(Long id, String name, int age, Location locationId) { 
    super(); 
    this.id = id; 
    this.name = name; 
    this.age = age; 
    this.locationId = locationId; 
} 

public Long getId() { 
    return id; 
} 

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

public String getName() { 
    return name; 
} 

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


public int getAge() { 
    return age; 
} 

public void setAge(int age) { 
    this.age = age; 
} 

public String getGender() { 
    return gender; 
} 

public void setGender(String gender) { 
    this.gender = gender; 
} 

public Location getPosition() { 
    return locationId; 
} 

public void setPosition(Location locationId) { 
    this.locationId = locationId; 
} 

public Settings getSetting() { 
    return settingId; 
} 

public void setSetting(Settings setting) { 
    this.settingId = setting; 
} 



public Location getLocationId() { 
    return locationId; 
} 

public void setLocationId(Location locationId) { 
    this.locationId = locationId; 
} 

我真的希望有人能幫助我。我現在比沮喪多了。

編輯

我送我的要求與RESTClient實現(火狐附加組件) 網址:本地主機:8080/TravelPalServer/PAL/ 而RequestBody是:

{ 
"name": "Elena", 
"age": 22, 
"gender": "Female" 
} 

我也試過把「」圍繞屬性標識符;不會改變一個東西 當我從我的iOS應用程序(在模擬器內)發送請求時,我得到相同的服務器響應(因此RestClient不是問題)

在控制檯中出現什麼後, PUT請求

Hibernate: insert into Pal (age, gender, locationId, name, nationalityId, settingId) values (?, ?, ?, ?, ?, ?) 
+0

hwo是發送到服務器的請求嗎? –

+0

System.out.println(「Im Controller; added Pal:」+ person.getName()); 這給了什麼? – sreeprasad

+0

每一個SYSO都讓我很不幸。我嘗試通過Firefox的RestClient Addon發送請求,並從iPhone應用程序(在模擬器中)發送請求。我每次都得到相同的迴應。我要發送的內容Body:{ 「name」:「Elena」, 「age」:22, 性別:「女性」 } – user2571678

回答

0

我認爲你需要做到以下幾點:

一)爲您的@ModelAttribute指定一個名稱

public @ResponseBody Pal insertPal(@ModelAttribute("person") Pal person) { 

b)您需要使用MIME類型application/x-www-form-urlencoded提交表單。例如:

person=<json-string-here> 
+0

聽起來像是一個很好的解決方案。它試了一下,我現在發送了:person = { 「name」:「Elena」, 「age」:22, 「gender」:「Female」 }但仍是同樣的問題,一切都是空的。如果我沒有通過應用程序和HTTP請求嘗試它,我會說他甚至不發送響應體。雖然謝謝!順便說一句,你會改變註釋中的任何內容嗎?有時人們會在值字段中添加「person」:@RequestMapping(value =「/ {person}」,method = RequestMethod.PUT) – user2571678

+0

編輯:沒關係,這裏的迴應是:「方法不允許」假設它爲GET – user2571678

+0

不確定是否必須將請求中的內容類型設置爲「application/json」。確保存在並重試。 –