[SPRING] Spring - 도트 주석 뒤에 패스 변수 자름
SPRINGSpring - 도트 주석 뒤에 패스 변수 자름
전자 메일 주소로 사용자를 쿼리 할 수있는 REST 끝점을 설정하려고합니다. 이메일 주소는 경로의 마지막 부분이므로 Spring은 foo@example.com을 값 foo @ example으로 취급하고 확장자 .com을 절단합니다.
나는 비슷한 질문을 여기에 발견 점 MVC @PathVariable (.) 잘린 점점 그러나 AbstractAnnotationConfigDispatcherServletInitializer 및 WebMvcConfigurerAdapter를 사용하는 주석 기반 구성이 있습니다. xml 구성이 없으므로이 솔루션은 나를 위해 작동하지 않습니다.
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="useDefaultSuffixPattern" value="false" />
</bean>
또한 정규식을 사용하는이 솔루션을 시도했지만 중 하나를 작동하지 않았습니다.
@RequestMapping(value = "user/by-email/{email:.+}")
누구든지 xml없이 접미사 패턴 자르기를 해제하는 방법을 알고 있습니까?
해결법
-
==============================
1.URI 끝에있는 path 변수의 점은 예기치 않은 두 가지 동작을 일으 킵니다 (대다수의 Spring 구성 속성에 익숙하지 않은 사용자를 제외하고 대다수의 사용자는 예기치 않은 동작을합니다).
URI 끝에있는 path 변수의 점은 예기치 않은 두 가지 동작을 일으 킵니다 (대다수의 Spring 구성 속성에 익숙하지 않은 사용자를 제외하고 대다수의 사용자는 예기치 않은 동작을합니다).
첫 번째 ({email :. +} regex를 사용하여 수정할 수 있음)는 기본 Spring 구성이 모든 경로 확장과 일치한다는 것입니다. 따라서 / api / {file}에 대한 매핑을 설정하면 Spring이 /api/myfile.html에 대한 호출을 String 인수 myfile에 매핑합니다. 이것은 /api/myfile.html, /api/myfile.md, /api/myfile.txt 등이 모두 동일한 자원을 가리 키도록 할 때 유용합니다. 그러나 모든 엔드 포인트에서 정규식 해킹을 사용하지 않고도이 동작을 전역 적으로 해제 할 수 있습니다.
두 번째 문제는 첫 번째 문제와 관련이 있으며 @masstroy가 올바르게 수정했습니다. /api/myfile.*가 myfile 자원을 가리키면 Spring은 경로 확장자 (.html, .txt 등)가 자원이 특정 형식으로 리턴되어야 함을 나타냅니다. 이 동작은 일부 상황에서 매우 유용 할 수 있습니다. 그러나 메소드 매핑에 의해 반환 된 객체는이 형식으로 변환 될 수없고, Spring은 HttpMediaTypeNotAcceptableException을 던질 수 있습니다.
우리는 다음과 같이 둘 다 해제 할 수 있습니다 (스프링 부트 가정).
@Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override public void configurePathMatch(PathMatchConfigurer configurer) { // turn off all suffix pattern matching configurer.setUseSuffixPatternMatch(false); // OR // turn on suffix pattern matching ONLY for suffixes // you explicitly register using // configureContentNegotiation(...) configurer.setUseRegisteredSuffixPatternMatch(true); } @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(false); } }
콘텐츠 협상에 대해 자세히 알아보십시오.
-
==============================
2.이름 뒤에 경로 변수의 끝에 슬래시를 추가해야합니다.
이름 뒤에 경로 변수의 끝에 슬래시를 추가해야합니다.
@RequestMapping(value ="/test/{name}/")
요청은 다음과 같습니다.
http : // localhost : 8080/utooa/service/api/admin/test/Takeoff.Java@gmail.com/
-
==============================
3.이 기사의 ContentNegotiationConfigurer bean을 사용하여이 해결책을 찾았다. http://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc
이 기사의 ContentNegotiationConfigurer bean을 사용하여이 해결책을 찾았다. http://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc
WebConfig 클래스에 다음 구성을 추가했습니다.
@EnableWebMvc @Configuration @ComponentScan(basePackageClasses = { RestAPIConfig.class }) public class WebConfig extends WebMvcConfigurerAdapter { @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(false); configurer.defaultContentType(MediaType.APPLICATION_JSON); } }
.favorPathExtension (false)를 설정함으로써 Spring은 더 이상 파일 확장자를 사용하여 요청의 accept mediaType을 오버라이드하지 않습니다. 해당 메소드에 대한 Javadoc은 우선 순위가 가장 높은 요청 된 미디어 유형을 결정하기 위해 요청 경로의 확장을 사용해야하는지 여부를 나타냅니다.
그런 다음 정규 표현식을 사용하여 @RequestMapping을 설정합니다.
@RequestMapping(value = "/user/by-email/{email:.+}")
-
==============================
4.Java-Config 사용자 :
Java-Config 사용자 :
Spring 4를 사용하면 다음과 같이이 기능을 해제 할 수 있습니다.
@Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.setUseSuffixPatternMatch(false); } }
그런 다음 전체 응용 프로그램에서 점들이 점으로 처리됩니다.
from https://stackoverflow.com/questions/27419743/spring-path-variable-truncate-after-dot-annotation by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 MVC 기반 REST 서비스에 다중 / 혼합 요청을 보낼 수 없습니다. (0) | 2019.02.07 |
---|---|
[SPRING] Spring-boot thymeleaf는 클래스 패스에서 HTML 파일을로드한다. (0) | 2019.02.07 |
[SPRING] 봄 부팅 jpa 의존성 추가시 'entityManagerFactory'라는 이름으로 빈 생성 오류 (0) | 2019.02.07 |
[SPRING] 두 WAR 사이의 응용 프로그램 컨텍스트 공유? (0) | 2019.02.07 |
[SPRING] 스프링 부트 : JDBC 데이터 소스 구성을 외부화하는 방법? (0) | 2019.02.07 |