복붙노트

[SPRING] JSON을 생성하고 소비하는 컨트롤러 용 Spring RequestMapping

SPRING

JSON을 생성하고 소비하는 컨트롤러 용 Spring RequestMapping

application / json을 소비하고 생성하는 여러 Spring 컨트롤러를 사용하면 다음과 같은 긴 주석이 코드에 포함됩니다.

    @RequestMapping(value = "/foo", method = RequestMethod.POST,
            consumes = MediaType.APPLICATION_JSON_VALUE,
            produces = MediaType.APPLICATION_JSON_VALUE)

소비 및 생산에 대한 기본값이있는 "합성 / 상속 / 집계"주석을 생성 할 수있는 방법이 있습니까? 대신 다음과 같이 작성할 수 있습니다.

    @JSONRequestMapping(value = "/foo", method = RequestMethod.POST)

위의 @JSONRequestMapping과 같은 것을 어떻게 정의 할 수 있습니까? @RequestMapping처럼 전달 된 값과 메소드를 주목하십시오. 기본값이 적합하지 않은 경우 전달하거나 전달할 수있는 것이 좋습니다.

내가 돌아 오는 걸 통제해야 해. 나는 produce / consumes annotation-methods를 사용하여 적절한 Content-Type 헤더를 얻고 싶습니다.

해결법

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

    1.Spring 4.2.x부터 @RequestMapping을 메타 주석으로 사용하여 사용자 정의 매핑 주석을 생성 할 수있다. 그래서:

    Spring 4.2.x부터 @RequestMapping을 메타 주석으로 사용하여 사용자 정의 매핑 주석을 생성 할 수있다. 그래서:

    예, 그런 방법이 있습니다. 다음과 같은 메타 주석을 만들 수 있습니다.

    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @RequestMapping(consumes = "application/json", produces = "application/json")
    public @interface JsonRequestMapping {
        @AliasFor(annotation = RequestMapping.class, attribute = "value")
        String[] value() default {};
    
        @AliasFor(annotation = RequestMapping.class, attribute = "method")
        RequestMethod[] method() default {};
    
        @AliasFor(annotation = RequestMapping.class, attribute = "params")
        String[] params() default {};
    
        @AliasFor(annotation = RequestMapping.class, attribute = "headers")
        String[] headers() default {};
    
        @AliasFor(annotation = RequestMapping.class, attribute = "consumes")
        String[] consumes() default {};
    
        @AliasFor(annotation = RequestMapping.class, attribute = "produces")
        String[] produces() default {};
    }
    

    그런 다음 기본 설정을 사용하거나 원하는대로 재정의 할 수 있습니다.

    @JsonRequestMapping(method = POST)
    public String defaultSettings() {
        return "Default settings";
    }
    
    @JsonRequestMapping(value = "/override", method = PUT, produces = "text/plain")
    public String overrideSome(@RequestBody String json) {
        return json;
    }
    

    Spring의 javadoc 및 github wiki에서 AliasFor에 대한 자세한 내용을 볼 수 있습니다.

  2. ==============================

    2.귀하의 질문에 간단한 대답은 Java에서 주석 - 상속이 없다는 것입니다. 그러나 스프링 주석을 사용하여 문제를 해결할 수 있다고 생각하는 방법이 있습니다.

    귀하의 질문에 간단한 대답은 Java에서 주석 - 상속이 없다는 것입니다. 그러나 스프링 주석을 사용하여 문제를 해결할 수 있다고 생각하는 방법이 있습니다.

    @RequestMapping은 형식 수준과 메서드 수준에서 모두 지원됩니다.

    @RequestMapping을 유형 수준에 배치하면 대부분의 속성이 해당 클래스의 각 메소드에 대해 상속됩니다. 이것은 Spring 참조 문서에 언급되어있다. @RequestMapping을 유형에 추가 할 때 각 속성을 처리하는 방법에 대한 자세한 내용은 API 문서를 참조하십시오. 아래의 각 속성에 대해이를 요약했습니다.

    다음은 이것을 사용하는 방법을 보여주는 간단한 예제 컨트롤러입니다.

    package com.example;
    
    import org.springframework.http.MediaType;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    @RequestMapping(path = "/", 
            consumes = MediaType.APPLICATION_JSON_VALUE, 
            produces = MediaType.APPLICATION_JSON_VALUE, 
            method = {RequestMethod.GET, RequestMethod.POST})
    public class JsonProducingEndpoint {
    
        private FooService fooService;
    
        @RequestMapping(path = "/foo", method = RequestMethod.POST)
        public String postAFoo(@RequestBody ThisIsAFoo theFoo) {
            fooService.saveTheFoo(theFoo);
            return "http://myservice.com/foo/1";
        }
    
        @RequestMapping(path = "/foo/{id}", method = RequestMethod.GET)
        public ThisIsAFoo getAFoo(@PathVariable String id) {
            ThisIsAFoo foo = fooService.getAFoo(id);
            return foo;
        }
    
        @RequestMapping(path = "/foo/{id}", produces = MediaType.APPLICATION_XML_VALUE, method = RequestMethod.GET)
        public ThisIsAFooXML getAFooXml(@PathVariable String id) {
            ThisIsAFooXML foo = fooService.getAFoo(id);
            return foo;
        }
    }
    
  3. ==============================

    3.@Controller 주석 대신 @RestController를 사용할 수 있습니다.

    @Controller 주석 대신 @RestController를 사용할 수 있습니다.

  4. ==============================

    4.소비를 구성하거나 생산 속성을 전혀 필요가 없어야합니다. Spring은 다음 요소들을 기반으로 JSON을 자동으로 처리합니다.

    소비를 구성하거나 생산 속성을 전혀 필요가 없어야합니다. Spring은 다음 요소들을 기반으로 JSON을 자동으로 처리합니다.

    Wim의 제안에 따라 컨트롤러를 @RestController 어노테이션으로 정의해야합니다. 이렇게하면 각 요청 메소드에 @ResponseBody를 주석으로 추가하지 않아도됩니다.

    이 접근법의 또 다른 이점은 클라이언트가 JSON 대신 XML을 원한다면 얻을 수 있다는 것입니다. accepts 헤더에 xml을 지정하기 만하면됩니다.

  5. ==============================

    5.Spring에는 @RequestBody와 @ResponseBody의 두 가지 주석이 있습니다. 이러한 주석은 각각 JSON을 생성하고 소비합니다. 여기에 더 많은 정보가 있습니다.

    Spring에는 @RequestBody와 @ResponseBody의 두 가지 주석이 있습니다. 이러한 주석은 각각 JSON을 생성하고 소비합니다. 여기에 더 많은 정보가 있습니다.

  6. from https://stackoverflow.com/questions/35123835/spring-requestmapping-for-controllers-that-produce-and-consume-json by cc-by-sa and MIT license