[SPRING] 이 RESTful 애플리케이션 예제에서 Spring @ResponseBody 어노테이션은 어떻게 작동합니까?
SPRING이 RESTful 애플리케이션 예제에서 Spring @ResponseBody 어노테이션은 어떻게 작동합니까?
나는 다음과 같은 방법으로 주석을 달았습니다.
/**
* Provide a list of all accounts.
*/
// TODO 02: Complete this method. Add annotations to respond
// to GET /accounts and return a List<Account> to be converted.
// Save your work and restart the server. You should get JSON results when accessing
// http://localhost:8080/rest-ws/app/accounts
@RequestMapping(value="/orders", method=RequestMethod.GET)
public @ResponseBody List<Account> accountSummary() {
return accountManager.getAllAccounts();
}
그래서 나는이 주석에 의해 그것을 안다.
@RequestMapping(value="/orders", method=RequestMethod.GET)
이 메소드는 URL / orders에 의해 표현 된 자원에 대한 GET HTTP 요청을 처리합니다.
이 메서드는 List를 반환하는 DAO 객체를 호출합니다.
여기서 Account는 시스템의 사용자를 나타내며이 사용자를 나타내는 몇 가지 필드가 있습니다 (예 :
public class Account {
@Id
@Column(name = "ID")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long entityId;
@Column(name = "NUMBER")
private String number;
@Column(name = "NAME")
private String name;
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name = "ACCOUNT_ID")
private Set<Beneficiary> beneficiaries = new HashSet<Beneficiary>();
...............................
...............................
...............................
}
내 질문은 : 정확히 @ResponseBody 주석은 어떻게 작동합니까?
이것은 반환 된 List
또한 공식 Spring 문서를 읽으십시오. http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/ResponseBody.html
List
이전 accountSummary () 메소드의 주석에 다음과 같이 쓰여 있습니다 :
그러면 이것이 정확히 무엇을 의미합니까? accountSummary () 메서드에서 반환 된 List
이 주장이 사실이라면 객체가 JSON 형식으로 자동 변환 될 곳은 어디입니까? @ResponseBody 주석이 사용되거나 다른 곳에서 지정 될 때 채택되는 표준 형식입니까?
해결법
-
==============================
1.우선 주석은 목록에 주석을 추가하지 않습니다. RequestMapping과 마찬가지로 메서드에 주석을 추가합니다. 귀하의 코드는 다음과 같습니다.
우선 주석은 목록에 주석을 추가하지 않습니다. RequestMapping과 마찬가지로 메서드에 주석을 추가합니다. 귀하의 코드는 다음과 같습니다.
@RequestMapping(value="/orders", method=RequestMethod.GET) @ResponseBody public List<Account> accountSummary() { return accountManager.getAllAccounts(); }
이제 주석이 의미하는 것은 메소드의 리턴 값이 HTTP 응답의 본문을 구성한다는 것입니다. 물론 HTTP 응답에는 Java 객체를 포함 할 수 없습니다. 따라서이 계정 목록은 JSON 또는 XML과 같은 REST 응용 프로그램에 적합한 형식으로 변환됩니다.
형식 선택은 설치된 메시지 변환기, RequestMapping 주석의 produce 속성 값 및 클라이언트가 승인하는 내용 유형 (HTTP 요청 헤더에서 사용 가능)에 따라 다릅니다. 예를 들어 요청에서 XML을 허용하지만 JSON을 허용하지 않는다고하고 목록을 XML로 변환 할 수있는 메시지 변환기가 설치된 경우 XML이 반환됩니다.
-
==============================
2.이해해야 할 첫 번째 기본 사항은 아키텍처의 차이입니다.
이해해야 할 첫 번째 기본 사항은 아키텍처의 차이입니다.
한쪽 끝은 웹 페이지를 사용하는 일반 웹 앱을 기반으로하는 MVC 아키텍처이며 브라우저는 페이지를 요청합니다.
Browser <---> Controller <---> Model | | +-View-+
브라우저가 요청을하고 컨트롤러 (@Controller)가 모델 (@Entity)을 가져오고 모델에서 뷰 (JSP)를 만들고 뷰가 클라이언트에 반환됩니다. 이것이 기본적인 웹 앱 아키텍처입니다.
다른 한편으로는 RESTful 아키텍처가있다. 이 경우보기가 없습니다. 컨트롤러는 모델 (또는 RESTful 용어로 리소스 표현) 만 반환합니다. 클라이언트는 자바 스크립트 애플리케이션, Java 서버 애플리케이션, REST API를 공개하는 모든 애플리케이션이 될 수 있습니다. 이 아키텍처를 사용하여 클라이언트는이 모델로 수행 할 작업을 결정합니다. 예를 들어 Twitter를 예로 들어 보겠습니다. 응용 프로그램에서 API를 사용하여 상태 업데이트 등의 작업을 수행 할 수 있도록하는 REST (Twitter as the Web) API를 사용하여 해당 데이터를 응용 프로그램에 넣을 수 있습니다. 이 데이터는 JSON과 같은 형식으로 제공됩니다.
즉, 스프링 MVC로 작업 할 때 기본 웹 애플리케이션 아키텍처를 처리하기 위해 처음으로 빌드되었습니다. 우리의 메서드에서 뷰를 생성 할 수있는 다른 메서드 시그니처의 맛이있을 수 있습니다. 이 메소드는 명시 적으로 모델을 생성하는 ModelAndView를 반환하거나 모델 속성으로 설정된 임의의 객체를 반환 할 수있는 암시 적 방법을 제공합니다. 그러나 어느 쪽이든, 요청 - 응답주기의 어딘가에는 견해가 생길 것입니다.
그러나 우리가 @ResponseBody를 사용할 때 우리는 뷰가 생성되는 것을 원하지 않는다고 말하고 있습니다. 우리는 우리가 지정한 형식으로 반환 객체를 본문으로 보내려합니다. 직렬화 된 Java 객체가되기를 원하지 않습니다 (가능한 경우). 그래서 예, 다른 일반적인 유형으로 변환해야합니다 (이 유형은 일반적으로 내용 협상을 통해 처리됩니다 - 아래 링크 참조). 솔직히, 저는 여기저기서 내가 손댈 수 있지만, 나는 봄과는별로 일하지 않습니다. 일반적으로 나는
@RequestMapping(..., produces = MediaType.APPLICATION_JSON_VALUE)
콘텐츠 유형을 설정하지만 JSON이 기본값입니다. 견적을 보내지 마십시오.하지만 JSON을 얻었고 제품을 지정하지 않은 경우 기본값이 될 수 있습니다. JSON만이 유일한 형식은 아닙니다. 예를 들어 위의 내용은 XML로 쉽게 보낼 수 있지만 MediaType.APPLICATION_XML_VALUE로 생성해야합니다. JAXB 용 HttpMessageConverter를 구성해야한다고 생각합니다. 구성된 JSON MappingJacksonHttpMessageConverter에 대해서는 클래스 패스에 Jackson이있을 때입니다.
Content Negotiation에 대해 배우려면 시간이 좀 걸릴 것입니다. 그것은 REST의 매우 중요한 부분입니다. 다양한 응답 형식 및 방법에 매핑하는 방법에 대해 배울 수 있습니다.
-
==============================
3.JB Nizet이 언급했듯이,
JB Nizet이 언급했듯이,
@RequestMapping(value="/orders", method=RequestMethod.GET) @ResponseBody public List<Account> accountSummary() { return accountManager.getAllAccounts(); }
과
@RequestMapping(value="/orders", method=RequestMethod.GET) public @ResponseBody List<Account> accountSummary() { return accountManager.getAllAccounts(); }
둘 다 동일합니다. @ResponseBody는 목록이 아닌 메소드에 주석을 달아줍니다. @GMsoF -Installed 메시지 변환기는 다음과 같이 사용할 수 있습니다.
@RequestMapping(value="/orders", method=RequestMethod.GET , produces={"application/json","application/xml"}) @ResponseBody public List<Account> accountSummary() { return accountManager.getAllAccounts(); }
감사 :)
-
==============================
4.더 나아가 리턴 타입은 다음과 같이 결정됩니다.
더 나아가 리턴 타입은 다음과 같이 결정됩니다.
선택 사항이 하나만 있으면이 예에서 JSON이됩니다.
이것은 코스 노트에서 다룹니다. 메시지 변환기 및 내용 협상에 대한 참고 사항을 찾으십시오.
from https://stackoverflow.com/questions/28646332/how-does-the-spring-responsebody-annotation-work-in-this-restful-application-ex by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 이름이 [duplicate] 인 DispatcherServlet의 URI가있는 HTTP 요청에 대한 매핑이 없습니다 (0) | 2018.12.13 |
---|---|
[SPRING] JUnit 테스트는 Eclipse에서는 성공하지만 Maven Surefire에서는 실패합니다. (0) | 2018.12.13 |
[SPRING] Spring hibernate template은 언제 사용 하는가? 왜? (0) | 2018.12.13 |
[SPRING] Spring에서 조건부 자동 배선을 수행하는 방법은 무엇입니까? (0) | 2018.12.13 |
[SPRING] Spring Cloud Eureka 서버 자체 보존 및 갱신 임계 값 이해 (0) | 2018.12.13 |