2013-04-23 38 views
1

我有以下REST服務建立在Spring周圍。我想實現一個可以添加用戶的POST方法。用戶的數據位於請求正文中,可以使用JSON/XML。我想服務器端實現春天綁定一個bean來休息post請求

  1. 使用單一的實現輸入的數據自動映射到Java bean的
  2. 和處理這兩種類型的數據(JSON/XML)。

我已經在UserControlleraddUser@ModelAttribute嘗試,但得到的user對象空各個領域。任何線索?

下面是Spring配置文件

<mvc:annotation-driven /> 

<context:component-scan base-package="com.rest.sg.controller" /> 

<bean 
    class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="order" value="1" /> 
    <property name="mediaTypes"> 
     <map> 
      <entry key="json" value="application/json" /> 
      <entry key="xml" value="application/xml" /> 
     </map> 
    </property> 

    <property name="defaultViews"> 
     <list> 
      <!-- JSON View --> 
      <bean 
       class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"> 
      </bean> 
      <!-- XML view --> 
      <bean class="org.springframework.web.servlet.view.xml.MarshallingView"> 
       <constructor-arg> 
        <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
         <property name="classesToBeBound"> 
          <list> 
           <value>com.rest.sg.bean.User</value> 
          </list> 
         </property> 
        </bean> 
       </constructor-arg> 
      </bean> 
     </list> 
    </property> 
    <property name="ignoreAcceptHeader" value="true" /> 

</bean> 

UserController類和ADDUSER方法

@Controller 
public class UserController { 

    @RequestMapping(method=RequestMethod.POST, value="/user") 
    @ResponseBody 
    public User addUser(@ModelAttribute("user") User user) { 
     userService.addUser(user); 
     return user; 
    } 

} 

和用戶的Bean

@Entity 
@XmlRootElement 
@Table(name = "user", catalog = "blahblah") 
public class User implements java.io.Serializable { 

    // Fields 
    // Getter , Setters 
    ... 

} 

回答

1

你的控制器需要知道如何將數據映射。缺省值是映射對象屬性的請求參數。

如果您發送的JSON表示User對象,你可以嘗試

public User addUser(@RequestBody User user) { 
+0

如果我使用'code' @ RequestBody,我在客戶端收到'code'HTTP狀態415。錯誤描述是'code'服務器拒絕了這個請求,因爲請求實體的格式不是所請求方法()的請求資源所支持的格式。 – 2013-04-24 05:57:30

+0

您的請求是否具有內容類型'application/json'(或'application/xml')?你有沒有把傑克遜包括在你的類路徑中(如果你的請求是JSON)? – zeroflagL 2013-04-24 07:52:38

+0

是的,我把傑克遜列入了課程路徑。我試圖用這兩種類型,即JSON/XML,因爲我想單一的方法來處理這兩種數據類型(在我的問題中的第2點) – 2013-04-25 13:23:08

0

這樣做:

@RequestMapping(value="/persons", method = RequestMethod.POST, 
       headers="Accept=*/*", 
       consumes="application/json") 
public User addUser(@RequestBody User u){ 
       //Code. 
} 

當發送請求,發送標題

Content-Type:application/json //This is important 
Accept: application/json 
+0

其實我想要這個方法來處理這兩種數據類型,即XML/JSON(在我的問題中的第2點)。我認爲這是可能的,但如何? – 2013-04-25 13:24:20

+0

你需要'ContentNegotiatingViewResolver' http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.html – 2013-04-25 15:31:22

+0

我想我已經使用'ContentNegotiationViewResolver'但無法正常工作 – 2013-04-26 07:25:43