簡體   English   中英

在Spring REST控制器中將JSON映射到Hibernate模型

[英]Mapping JSON to Hibernate models in Spring REST Controllers

假設我有一個帶有基於Hibernate持久層的Spring 4 Web應用程序。 我想為我的模型創建一個支持基本CRUD操作的RestController 創建用於獲取記錄的方法的工作很順利:

@RequestMapping(value = "/stuff/list", method = RequestMethod.GET)
public List<Stuff> getStuff(){
    return stuffService.findAll();
}

傑克遜處理對象序列化,沒問題。 但是,如果我想添加一種通過POST請求創建新記錄的方法,該怎么辦? 有沒有簡單的方法來支持這樣的簡單方法?

@RequestMapping(value = "/stuff/new", method = RequestMethod.POST)
public Integer getStuff(@RequestParam("stuff") Stuff stuff){
    return stuffService.save(stuff);
}

這樣的事情可能嗎? 還是我需要手動將發布的表單數據映射到新對象?

這是我解決問題的方法,有幾個步驟。 首先,我的最終控制器方法:

@RequestMapping(value = "/stuff/new", method = RequestMethod.POST)
public Integer getStuff(@RequestBody Stuff stuff){
    return stuffService.save(stuff);
}

我已經將過濾器應用於對應用程序API的所有請求,以允許跨源資源共享,但是需要對此進行修改以允許請求指定內容類型:

public class SimpleCORSFilter implements Filter{

    @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
            FilterChain filterChain) throws IOException, ServletException {

        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with, Content-Type");
        filterChain.doFilter(servletRequest, servletResponse);

    }

    @Override public void init(FilterConfig filterConfig) throws ServletException { }

    @Override public void destroy() { }
}

這是在我的web.xml文件中注冊的:

<filter>
    <filter-name>cors</filter-name>
    <filter-class>com.company.app.util.SimpleCORSFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>cors</filter-name>
    <url-pattern>/api/*</url-pattern>
</filter-mapping>

現在,當我發出一個請求(例如以下請求)時,它將正確地將我提交的JSON映射到我的模型並保留一個新實例:

var stuff = {
    name: "Some stuff",
    description: "This is some stuff."
}

$.ajax({
    url: url,
    method: "post",
    dataType: "json",
    data: JSON.stringify(stuff),
    contentType: "application/json"
  }).done(function(data){
    console.log(data);
  }).fail(function(x, status, e){
    console.log(e);
  });

是的,一點沒錯。 傑克遜將自動做實體的雙向映射,所以如果你想POST一些東西到服務器只使用你看到的時候你做同樣的JSON格式GET

要告訴Spring您希望它對內容應用反序列化器而不是嘗試使用標准HTML表單綁定,請使用@RequestBody

@RequestMapping(value = "/stuff/new", method = RequestMethod.POST)
public Integer getStuff(@RequestBody Stuff stuff){
    return stuffService.save(stuff);
}

@RequestParam告訴它查找具有該名稱的單個參數並應用標准數據綁定,而不是將POST的全部內容反序列化為一個對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM