[java] Spring의 @RequestBody 및 @ResponseBody 주석

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



답변

문서에는 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 템플릿 렌더링이.


답변

@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.

상세 사항은


답변

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

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

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


답변

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 이것은 우리가 이것을 도와주세요 …. .


답변