Spring의 @RequestBody 및 @ResponseBody 주석


139

누군가 가 Spring 3의 주석 @RequestBody과 설명을 설명 할 수 있습니까 @ResponseBody? 그들은 무엇입니까? 모든 예가 좋을 것입니다.

답변:


219

문서에는 16.3.3.4 @RequestBody 주석으로 요청 본문 매핑 이라는 전체 섹션이 있습니다 . 16.3.3.5 @ResponseBody 주석을 사용하여 응답 본문 매핑을 호출 했습니다 . 해당 섹션을 참조하십시오. 관련성 : @RequestBodyjavadocs, @ResponseBodyjavadocs

사용 예는 다음과 같습니다.

JQuery와 같은 JavaScript 라이브러리를 사용하면 다음과 같은 JSON-Object를 게시 할 수 있습니다.

{ "firstName" : "Elmer", "lastName" : "Fudd" }

컨트롤러 방법은 다음과 같습니다.

// controller
@ResponseBody @RequestMapping("/description")
public Description getDescription(@RequestBody UserStats stats){
    return new Description(stats.getFirstName() + " " + stats.getLastname() + " hates wacky wabbits");
}

// domain / value objects
public class UserStats{
    private String firstName;
    private String lastName;
    // + getters, setters
}
public class Description{
    private String description;
    // + getters, setters, constructor
}

이제 클래스 경로에 Jackson 이 있고 <mvc:annotation-driven>설정 이있는 경우 Spring은 들어오는 JSON을 포스트 본문에서 UserStats 객체로 변환하고 ( @RequestBody주석 을 추가했기 때문에 ) 반환 된 객체를 JSON으로 직렬화합니다 ( @ResponseBody주석). 따라서 브라우저 / 클라이언트는 다음 JSON 결과를 볼 수 있습니다.

{ "description" : "Elmer Fudd hates wacky wabbits" }

완전한 작동 예는이 이전 답변을 참조하십시오 : https://stackoverflow.com/a/5908632/342852

참고 : RequestBody / ResponseBody는 물론 JSON으로 제한되지 않으며 일반 텍스트 및 XML을 포함한 여러 형식을 처리 할 수 ​​있지만 JSON이 가장 많이 사용되는 형식 일 수 있습니다.


최신 정보

Spring 4.x 이후로, 보통 같은 @ResponseBody방법으로 메소드 레벨에서 사용하지 않고 @RestController클래스 레벨에서 사용합니다.

공식 Spring MVC 문서 에서 인용 한 내용은 다음과 같습니다 .

@RestControllerA는 구성된 주석 자체가 애노테이션 메타@Controller@ResponseBody그의 모든 방법 유형 레벨 상속 제어기 나타낼 @ResponseBody주석, 따라서, 도면의 해상도에 비해 응답 본체에 직접 기록 및 HTML 템플릿 렌더링이.


링크 된 답변 @ResponseBody에서 메소드가 아닌 매개 변수에 주석을 사용했습니다 . 메소드에 넣는 중에 오류가 발생하므로 다른 답변이 정확하다고 가정합니다. 나는 당신이 getDescription(@RequestBody UserStats stats)위에 있어야한다고 생각합니다 .
패트릭

3
@Patrick no @RequestBody는 매개 변수 @ResponseBody에 있고 메소드에 있습니다. 중요한 차이점!
숀 패트릭 플로이드

1
@SeanPatrickFloyd 죄송합니다 @ResponseBody. 전혀 언급 할 생각은 없었 습니다. 방금 말했듯 @RequestBody이 매개 변수로갑니다. 그러나 위의 답변에서 당신은 방법에 있습니다.
Patrick

1
@SeanPatrickFloyd @RequestBody는 실제로 여전히 필요하며 @ResponseBody를 사용할 때 암시 적 @RestController입니다. pls는 당신의 대답을 수정, 그것은 거짓으로 너무 많은 upvotes가 있습니다!
Suin Jain

@SumitJain 공정하게 :이 답변은 전에 주위에 왔으며 @RestController그것이 소개되었을 때 변경되었습니다
Sean Patrick Floyd

32

@RequestBody : 메소드 매개 변수를 나타내는 어노테이션이 HTTP 요청의 본문에 바인드되어야합니다.

예를 들면 다음과 같습니다.

@RequestMapping(path = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
    writer.write(body);
}

@ResponseBody 주석은 메소드에 넣을 수 있으며 리턴 유형이 HTTP 응답 본문에 직접 작성되어야하고 모델에 배치되거나 뷰 이름으로 해석되지 않아야 함을 나타냅니다.

예를 들면 다음과 같습니다.

@RequestMapping(path = "/something", method = RequestMethod.PUT)
public  @ResponseBody String helloWorld() {
    return "Hello World";
}  

또는 주석 대신 @RestController 주석을 사용할 수 있습니다 @Controller. 이렇게하면를 사용할 필요가 없습니다 @ResponseBody.

상세 사항은


5

아래는 Java 컨트롤러의 메소드 예입니다.

@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public HttpStatus something(@RequestBody MyModel myModel) 
{
    return HttpStatus.OK;
}

@RequestBody 어노테이션을 사용하면 특정 호출을 처리하기 위해 시스템에서 작성한 모델과 값이 맵핑됩니다. @ResponseBody를 사용하면 요청이 생성 된 곳으로 무엇이든 보낼 수 있습니다. 두 가지 모두 사용자 정의 파서 등을 작성하지 않고도 쉽게 매핑됩니다.


1
package com.programmingfree.springshop.controller;

import java.util.List;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.programmingfree.springshop.dao.UserShop;
import com.programmingfree.springshop.domain.User;


@RestController
@RequestMapping("/shop/user")
public class SpringShopController {

 UserShop userShop=new UserShop();

 @RequestMapping(value = "/{id}", method = RequestMethod.GET,headers="Accept=application/json")
 public User getUser(@PathVariable int id) {
  User user=userShop.getUserById(id);
  return user;
 }


 @RequestMapping(method = RequestMethod.GET,headers="Accept=application/json")
 public List<User> getAllUsers() {
  List<User> users=userShop.getAllUsers();
  return users;
 }


}

위의 예에서 모든 사용자 및 특정 ID 세부 정보를 표시하려고합니다 .ID와 이름을 모두 사용하고 싶습니다.

1) localhost : 8093 / plejson / shop / user <---이 링크는 모든 사용자 정보를 표시합니다
2) localhost : 8093 / plejson / shop / user / 11 <---- 링크 수단으로 11을 사용하면 특정 사용자 표시 11 세부 사항

이제 아이디와 이름을 모두 사용하고 싶습니다

localhost : 8093 / plejson / shop / user / 11 / raju <----------------- like 이것은 우리가 이것을 도와주세요 .... .


답변 및 코드 샘플의 형식을 수정하십시오.
Maciej Lach

이 코드가 질문자에게 어떻게 도움이되는지 설명하십시오. 감사합니다.
Leonid Glanz

programming-free.com/2014/03/… ....................이 링크를 통해 이동하면 감사합니다
user5409646

programming-free.com/2014/03/… ....................................... .................................................. .....이 링크를 통해 이동 u 감사합니다
user5409646
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.