Spring RESTful 어플리케이션에 ResponseEntity 및 @RestController를 사용 하는 경우
저는 Spring Framework 4.0.7과 MVC 및 Rest를 함께 사용하고 있습니다.
안심하고 작업할 수 있는 고객:
@Controller
ResponseEntity<T>
예를 들어 다음과 같습니다.
@Controller
@RequestMapping("/person")
@Profile("responseentity")
public class PersonRestResponseEntityController {
(작성만 하는) 방법으로
@RequestMapping(value="/", method=RequestMethod.POST)
public ResponseEntity<Void> createPerson(@RequestBody Person person, UriComponentsBuilder ucb){
logger.info("PersonRestResponseEntityController - createPerson");
if(person==null)
logger.error("person is null!!!");
else
logger.info("{}", person.toString());
personMapRepository.savePerson(person);
HttpHeaders headers = new HttpHeaders();
headers.add("1", "uno");
//http://localhost:8080/spring-utility/person/1
headers.setLocation(ucb.path("/person/{id}").buildAndExpand(person.getId()).toUri());
return new ResponseEntity<>(headers, HttpStatus.CREATED);
}
돌려주다
@RequestMapping(value="/{id}", method=RequestMethod.GET)
public ResponseEntity<Person> getPerson(@PathVariable Integer id){
logger.info("PersonRestResponseEntityController - getPerson - id: {}", id);
Person person = personMapRepository.findPerson(id);
return new ResponseEntity<>(person, HttpStatus.FOUND);
}
정상적으로 동작합니다.
다음 항목에서도 같은 작업을 수행할 수 있습니다.
@RestController
(은 (동일하다)와 같은 있습니다@Controller
+@ResponseBody
@ResponseStatus
예를 들어 다음과 같습니다.
@RestController
@RequestMapping("/person")
@Profile("restcontroller")
public class PersonRestController {
(작성만 하는) 방법으로
@RequestMapping(value="/", method=RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public void createPerson(@RequestBody Person person, HttpServletRequest request, HttpServletResponse response){
logger.info("PersonRestController - createPerson");
if(person==null)
logger.error("person is null!!!");
else
logger.info("{}", person.toString());
personMapRepository.savePerson(person);
response.setHeader("1", "uno");
//http://localhost:8080/spring-utility/person/1
response.setHeader("Location", request.getRequestURL().append(person.getId()).toString());
}
돌려주다
@RequestMapping(value="/{id}", method=RequestMethod.GET)
@ResponseStatus(HttpStatus.FOUND)
public Person getPerson(@PathVariable Integer id){
logger.info("PersonRestController - getPerson - id: {}", id);
Person person = personMapRepository.findPerson(id);
return person;
}
질문은 다음과 같습니다.
- 확실한 이유 또는 특정 시나리오를 위해 한 옵션을 다른 옵션보다 의무적으로 사용해야 할 경우
- (1)이 중요하지 않은 경우, 어떤 접근방식을 제안하고 그 이유를 제시합니다.
ResponseEntity
응답 합니다.상태 코드, 머리글 및 본문 등 모든 항목을 제어할 수 있습니다.
@ResponseBody
과 HTTP 응답 본문의 입니다.@ResponseStatus
를 선언합니다.
@ResponseStatus
츠미야전체 메서드가 표시되므로 핸들러 메서드가 항상 동일하게 동작하는지 확인해야 합니다.그리고 여전히 헤더를 설정할 수 없습니다.필요한 것은,HttpServletResponse
.
으로는 ★★★★★★★★★★★★★★★★★」ResponseEntity
자, 그럼.
Sotorios Delimanolis에서 답을 완성합니다.
ResponseEntity
은 더 의 경우 엔 이런 ResponseEntity
모든 컨트롤러에 적용되기 때문에 읽고 이해하는 것이 어렵습니다.
오류(Not Found, Conflict 등)와 같은 특수한 경우를 처리하는 경우 스프링 구성에 를 추가할 수 있습니다.따라서 코드에서는 특정 예외를 발생시킬 뿐입니다.NotFoundException
예를 들어, 컨트롤러 코드를 보다 명확하게 하기 위해 핸들러에서 수행할 작업을 결정합니다(HTTP 상태를 404로 설정).
공식 문서에 따르면:@RestController 주석을 사용한 REST 컨트롤러 생성
@RestController는 @ResponseBody와 @Controller를 결합한 고정관념 주석입니다.또한 이는 컨트롤러에게 더 큰 의미를 부여하며 프레임워크의 향후 릴리스에서 추가적인 의미론도 포함할 수 있습니다.
쓰는 게 것 요.@RestController
알기 쉽게 하기 위해서입니다만, 이 기능을 조합할 수도 있습니다.ResponseEntity
(공식 튜토리얼과 여기 코드, 그리고 그것을 확인하기 위한 제 질문에 따라).
예를 들어 다음과 같습니다.
@RestController
public class MyController {
@GetMapping(path = "/test")
@ResponseStatus(HttpStatus.OK)
public User test() {
User user = new User();
user.setName("Name 1");
return user;
}
}
다음과 같습니다.
@RestController
public class MyController {
@GetMapping(path = "/test")
public ResponseEntity<User> test() {
User user = new User();
user.setName("Name 1");
HttpHeaders responseHeaders = new HttpHeaders();
// ...
return new ResponseEntity<>(user, responseHeaders, HttpStatus.OK);
}
}
이렇게 하면ResponseEntity
필요할 때만.
갱신하다
다음을 사용할 수 있습니다.
return ResponseEntity.ok().headers(responseHeaders).body(user);
적절한 REST API에는 다음과 같은 컴포넌트가 대응하고 있어야 합니다.
- 상태 코드
- 응답 본문
- 변경된 리소스의 위치(예를 들어 리소스가 생성된 경우 클라이언트는 해당 위치의 URL을 알고 싶어합니다)
ResponseEntity의 주요 목적은 옵션 3을 제공하는 것이었으며, ResponseEntity 없이 나머지 옵션을 달성할 수 있었습니다.
따라서 리소스 위치를 제공하려면 ResponseEntity를 사용하는 것이 좋습니다.그렇지 않으면 사용하지 않아도 됩니다.
API를 수정하여 언급된 모든 옵션을 제공하는 예를 생각해 보십시오.
// Step 1 - Without any options provided
@RequestMapping(value="/{id}", method=RequestMethod.GET)
public @ResponseBody Spittle spittleById(@PathVariable long id) {
return spittleRepository.findOne(id);
}
// Step 2- We need to handle exception scenarios, as step 1 only caters happy path.
@ExceptionHandler(SpittleNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public Error spittleNotFound(SpittleNotFoundException e) {
long spittleId = e.getSpittleId();
return new Error(4, "Spittle [" + spittleId + "] not found");
}
// Step 3 - Now we will alter the service method, **if you want to provide location**
@RequestMapping(
method=RequestMethod.POST
consumes="application/json")
public ResponseEntity<Spittle> saveSpittle(
@RequestBody Spittle spittle,
UriComponentsBuilder ucb) {
Spittle spittle = spittleRepository.save(spittle);
HttpHeaders headers = new HttpHeaders();
URI locationUri =
ucb.path("/spittles/")
.path(String.valueOf(spittle.getId()))
.build()
.toUri();
headers.setLocation(locationUri);
ResponseEntity<Spittle> responseEntity =
new ResponseEntity<Spittle>(
spittle, headers, HttpStatus.CREATED)
return responseEntity;
}
// Step4 - If you are not interested to provide the url location, you can omit ResponseEntity and go with
@RequestMapping(
method=RequestMethod.POST
consumes="application/json")
@ResponseStatus(HttpStatus.CREATED)
public Spittle saveSpittle(@RequestBody Spittle spittle) {
return spittleRepository.save(spittle);
}
언급URL : https://stackoverflow.com/questions/26549379/when-use-responseentityt-and-restcontroller-for-spring-restful-applications
'programing' 카테고리의 다른 글
useContext를 사용하여 컨텍스트 값을 변경하려면 어떻게 해야 합니까? (0) | 2023.03.11 |
---|---|
워드프레스 215에서 구글 폰트를 삭제하거나 큐를 해제하는 방법 (0) | 2023.03.11 |
왜 json은?포인터가 아닌 참조를 사용하여 마샬을 해제하시겠습니까? (0) | 2023.03.11 |
라우터와의 ui.bootstrap 종속성 추가 (0) | 2023.03.11 |
로컬 스토리지 vs AngularJS $cacheFactory (0) | 2023.03.06 |