스프링 요구 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;
}
것은, 을 .AliasFor
javadoc 와 github 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
'programing' 카테고리의 다른 글
html 입력의 속성을 덮어쓸 수 있는 것은 무엇입니까? (0) | 2023.03.11 |
---|---|
메타 및 이전 날짜를 포함한 쿼리를 게시합니다. (0) | 2023.03.06 |
get_home_url()은 현재 URL만 반환합니다. (0) | 2023.03.06 |
angular.js는 어떻게 내부 HTML을 재평가/재컴파일합니까? (0) | 2023.03.06 |
Xcode 11.0 빌드 get 오류 - 메서드의 알 수 없는 인수 유형 '_attribute__' - [RCTAppState getCurrentAppState:error:] (0) | 2023.03.06 |