복붙노트

[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 객체를 가져 와서 HTTP 응답에 넣는 것 같습니다. 이게 맞습니까? 아니면 오해입니까?

이전 accountSummary () 메소드의 주석에 다음과 같이 쓰여 있습니다 :

그러면 이것이 정확히 무엇을 의미합니까? accountSummary () 메서드에서 반환 된 List 객체가 자동으로 JSON 형식으로 변환 된 다음 HTTP 응답에 포함된다는 의미입니까? 또는 무엇을?

이 주장이 사실이라면 객체가 JSON 형식으로 자동 변환 될 곳은 어디입니까? @ResponseBody 주석이 사용되거나 다른 곳에서 지정 될 때 채택되는 표준 형식입니까?

해결법

  1. ==============================

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

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

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

    4.더 나아가 리턴 타입은 다음과 같이 결정됩니다.

    더 나아가 리턴 타입은 다음과 같이 결정됩니다.

    선택 사항이 하나만 있으면이 예에서 JSON이됩니다.

    이것은 코스 노트에서 다룹니다. 메시지 변환기 및 내용 협상에 대한 참고 사항을 찾으십시오.

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