programing

스프링 요구 JSON을 생성 및 사용하는 컨트롤러의 매핑

showcode 2023. 3. 6. 21:41
반응형

스프링 요구 JSON을 생성 및 사용하는 컨트롤러의 매핑

「」를 소비 및 application/json코드에는 다음과 같은 긴 주석이 흩어져 있습니다.

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

디폴트값을 사용하여 "복합/상속/집약" 주석을 생성할 수 있는 방법이 있습니까?consumes ★★★★★★★★★★★★★★★★★」produces대신 다음과 같이 쓸 수 있습니다.

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

요?@JSONRequestMapping '에 해 주세요.'value ★★★★★★★★★★★★★★★★★」method 입회하다@RequestMapping할 수 것도 consumes ★★★★★★★★★★★★★★★★★」produces디폴트가 적절하지 않은 경우.

돌아오는 걸 통제해야 해나는 그 것을 원한다.produces/consumes annotation-methods를 수 .Content-Type머리글을 클릭합니다.

4.2로는 Spring 4.2.x, Spring 4.2.x, Spring 4.2.x 를 할 수 .@RequestMapping그래서:

소비 및 생산에 대한 기본값을 사용하여 "복합/상속/집약" 주석을 생성하여 대신 다음과 같은 내용을 작성할 수 있는 방법이 있습니까?

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

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

@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;
}

것은, 을 .AliasForjavadocgithub wiki에 있습니다.

질문에 대한 간단한 답변은 Java에 주석 상속이 없다는 것입니다.그러나 스프링 주석을 사용하는 방법이 있어 문제를 해결하는 데 도움이 될 것 같습니다.

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

@RequestMapping유형 수준에서는 대부분의 속성이 해당 클래스의 각 메서드에 대해 '수정'됩니다.이것은 스프링 레퍼런스 문서에 기재되어 있습니다.각 Atribute를 추가할 때 어떻게 처리되는지에 대한 자세한 내용은 api 문서를 참조하십시오.@RequestMapping 。아래의속성별로 이하 각 속성별로 정리했습니다.

  • name: 의 값은 을 사용하여 유형 레벨의 값은 구분자로 '#'을 사용하여 메서드 레벨의 값과 연결됩니다.
  • value 이치노
  • path 이치노
  • method 이치노
  • params 이치노
  • headers 이치노
  • consumes은 메서드에 라고 입력합니다.
  • produces은 메서드에 라고 입력합니다.

다음으로 컨트롤러의 간단한 예를 제시하겠습니다.

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;
    }
}

consumptions 또는 products Atribute를 설정할 필요가 없습니다.스프링은 다음 요소에 따라 자동으로 JSON을 제공합니다.

  • 요청의 accepts 헤더는 application/json입니다.
  • @ResponseBody 주석 방식
  • 클래스 패스의 잭슨 라이브러리

또한 Wim의 제안에 따라 @RestController 주석을 사용하여 컨트롤러를 정의해야 합니다.그러면 @ResponseBody에서 각 요청 메서드에 주석을 달지 않아도 됩니다.

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

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

봄에는 @RequestBody @ResponseBody의 2개의 주석이 있습니다.이러한 주석은 각각 JSON을 생성합니다. 자세한 내용은 여기를 참조하십시오.

언급URL : https://stackoverflow.com/questions/35123835/spring-requestmapping-for-controllers-that-produce-and-consume-json

반응형