2014-08-28 2 views
0

Hibernate 기반 지속성 레이어가있는 Spring 4 웹 애플리케이션이 있다고 가정 해 보겠습니다. 내 모델의 기본 CRUD 작업을 지원하는 RestController을 만들고 싶습니다. 레코드를 가져 오는 메소드를 만드는 것은 장애없이 작동합니다.Spring REST 컨트롤러에서 JSON을 Hibernate 모델로 매핑

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

Jackson은 객체 직렬화를 처리하는데 아무런 문제가 없습니다. 하지만 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에 대한 모든 요청에 ​​적용되는 필터를했지만, 이에 대한 수정 요청 내용 유형을 지정할 수 있도록 필요했다 :

web.xml 파일에 등록되어
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() { } 
} 

: I는 아래와 같은 요청을 할 때 지금

<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); 
    }); 
+0

내용이 html 형식의 POST 또는 JSON입니까? – Affe

+0

@Affe : JSON, 브라우저 AJAX 요청 또는 Spring 'RestTemplate'을 통해 전송됩니다. – woemler

답변

1

스프링에게 표준 HTML 양식 바인딩 시도 대신 디시리얼라이저를 적용하려고한다고 지정하려면 @RequestBody을 사용하십시오.

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

@RequestParam

은 그 이름을 가진 개별 매개 변수에 대한보고 적용 표준 데이터 바인딩을 대상으로 POST의 전체 내용을 직렬화하지 그것을 말하고있다.

+0

'consumes = "application/something"을 명시 적으로 설정해야합니까? 아니면 적절한 JSON 형식을 기대합니까? 추가 요청 헤더가 필요합니까? – woemler

+0

다른 헤더가있는 요청을 다른 위치로 라우팅하거나 잠글 때만. 간단한 일을 위해서 즉시 사용할 수있는''은 "올바르게 해낼 것"입니다. (당신이 소비를 지정하면, 유효한 내용을 가진 요청을하지만 헤더가 누락되어 버리는 것을주의하십시오.) – Affe

+0

내 컨트롤러 메소드를 작성하는 것과 같은 결과가'415 (지원되지 않는 미디어 유형)'오류가됩니다. 또 다른 SO 응답 (http://stackoverflow.com/questions/11492325/post-json-fails-with-415-unsupported-media-type-spring-3-mvc)은 요청 헤더를 변경하는 것을 제안하지만 이는 도움이되지 않습니다. . – woemler

1

예, 물론입니다. Jackson은 엔티티의 양방향 매핑을 자동으로 수행하므로 POST을 서버에 보내려면 GET과 동일한 JSON 형식을 사용하면됩니다.

관련 문제