점 (.)이있는 Spring MVC @PathVariable이 잘립니다.
이것은 Spring MVC @PathVariable이 잘리는 문제의 연속입니다.
Spring 포럼에서는 ContentNegotiationManager의 일부로 고정 버전 (3.2 버전)을 발표했습니다. 아래 링크를 참조하십시오.
https://jira.springsource.org/browse/SPR-6164
https://jira.springsource.org/browse/SPR-7632
내 응용 프로그램에서 .com의 requestParameter가 잘립니다.
누구든지이 새로운 기능을 사용하는 방법을 설명해 주시겠습니까? xml에서 어떻게 구성 할 수 있습니까?
참고 : 스프링 포럼-# 1 Spring MVC @PathVariable with 도트 (.)가 잘립니다.
내가 아는 한이 문제는 요청 매핑이 끝날 때 경로 변수에만 나타납니다.
requestmapping에서 정규식 애드온을 정의하여 문제를 해결할 수있었습니다.
/somepath/{variable:.+}
봄의 마지막 점 뒤에 아무것도 같은 파일 확장자를 것을 고려 .json하거나 .xml당신의 매개 변수를 검색하는 데 trucate.
그래서 당신이 가지고 있다면 /somepath/{variable}:
/somepath/param,/somepath/param.json,/somepath/param.xml또는/somepath/param.anything값으로 될 것이다 PARAMparam/somepath/param.value.json,/somepath/param.value.xml또는/somepath/param.value.anything값으로 될 것이다 PARAMparam.value
매핑을 /somepath/{variable:.+}제안대로 변경 하면 마지막 점을 포함한 점이 매개 변수의 일부로 간주됩니다.
/somepath/param가치가있는 매개 변수가됩니다param/somepath/param.json가치가있는 매개 변수가됩니다param.json/somepath/param.xml가치가있는 매개 변수가됩니다param.xml/somepath/param.anything가치가있는 매개 변수가됩니다param.anything/somepath/param.value.json가치가있는 매개 변수가됩니다param.value.json- ...
확장 인식을 신경 쓰지 않으면 mvc:annotation-drivenautomagic 을 재정 의하여 비활성화 할 수 있습니다 .
<bean id="handlerMapping"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="contentNegotiationManager" ref="contentNegotiationManager"/>
<property name="useSuffixPatternMatch" value="false"/>
</bean>
따라서 다시 한 번 /somepath/{variable}:
/somepath/param,/somepath/param.json,/somepath/param.xml또는/somepath/param.anything값으로 될 것이다 PARAMparam/somepath/param.value.json,/somepath/param.value.xml또는/somepath/param.value.anything값으로 될 것이다 PARAMparam.value
참고 : 기본 구성과의 차이점은와 같은 매핑이있는 경우에만 표시됩니다 somepath/something.{variable}. Resthub 프로젝트 이슈 참조
확장 관리를 유지하려면 Spring 3.2부터 suffixPattern 인식을 활성화하지만 등록 된 확장으로 제한하기 위해 RequestMappingHandlerMapping Bean의 useRegisteredSuffixPatternMatch 특성을 설정할 수도 있습니다.
여기에 json 및 xml 확장자 만 정의하십시오.
<bean id="handlerMapping"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="contentNegotiationManager" ref="contentNegotiationManager"/>
<property name="useRegisteredSuffixPatternMatch" value="true"/>
</bean>
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false"/>
<property name="favorParameter" value="true"/>
<property name="mediaTypes">
<value>
json=application/json
xml=application/xml
</value>
</property>
</bean>
mvc : annotation-driven은 이제 customN을 제공하기 위해 contentNegotiation 옵션을 허용하지만 RequestMappingHandlerMapping의 특성을 true (기본값 false)로 변경해야합니다 ( https://jira.springsource.org/browse/SPR-7632). ).
따라서 여전히 모든 mvc : annotation-driven 구성을 대체해야합니다. 커스텀 RequestMappingHandlerMapping을 요청하기 위해 Spring 티켓을 열었습니다 : https://jira.springsource.org/browse/SPR-11253 . 참여하고 있다면 투표 해주세요.
재정의하는 동안 사용자 지정 실행 관리 재정의도 고려해야합니다. 그렇지 않으면 모든 사용자 지정 예외 매핑이 실패합니다. messageCoverters를 목록 Bean과 함께 재사용해야합니다.
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
<util:list id="messageConverters">
<bean class="your.custom.message.converter.IfAny"></bean>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean>
<bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean>
<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean>
<bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean>
<bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
</util:list>
<bean name="exceptionHandlerExceptionResolver"
class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver">
<property name="order" value="0"/>
<property name="messageConverters" ref="messageConverters"/>
</bean>
<bean name="handlerAdapter"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="webBindingInitializer">
<bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="conversionService" ref="conversionService" />
<property name="validator" ref="validator" />
</bean>
</property>
<property name="messageConverters" ref="messageConverters"/>
</bean>
<bean id="handlerMapping"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
</bean>
오픈 소스 프로젝트 인 Resthub 에서 이러한 주제에 대한 일련의 테스트를 구현했습니다. https://github.com/resthub/resthub-spring-stack/pull/219/files & https : // 참조 github.com/resthub/resthub-spring-stack/issues/217
Spring 4 업데이트 : 4.0.1부터는 PathMatchConfigurer(를 통해 WebMvcConfigurer) 사용할 수 있습니다.
@Configuration
protected static class AllResources extends WebMvcConfigurerAdapter {
@Override
public void configurePathMatch(PathMatchConfigurer matcher) {
matcher.setUseRegisteredSuffixPatternMatch(true);
}
}
xml에서는 ( https://jira.spring.io/browse/SPR-10163 )입니다.
<mvc:annotation-driven>
[...]
<mvc:path-matching registered-suffixes-only="true"/>
</mvc:annotation-driven>
Martin Frey의 답변 외에도 RequestMapping 값에 슬래시를 추가 하여이 문제를 해결할 수 있습니다.
/path/{variable}/
이 수정 프로그램은 유지 관리 기능을 지원하지 않습니다. 이제 모든 URI에는 슬래시가 있어야합니다. API 사용자 / 신규 개발자에게는 분명하지 않을 수 있습니다. 모든 매개 변수에 매개 변수가 없을 .수도 있으므로 간헐적 인 버그가 발생할 수도 있습니다.
Spring Boot Rest Controller에서 다음 단계에 따라 이러한 문제를 해결했습니다.
RestController :
@GetMapping("/statusByEmail/{email:.+}/")
public String statusByEmail(@PathVariable(value = "email") String email){
//code
}
그리고 나머지 클라이언트에서 :
Get http://mywebhook.com/statusByEmail/abc.test@gmail.com/
":. +"를 추가하면 나에게 도움이되었지만 바깥 쪽 중괄호를 제거 할 때까지는 효과가 없었습니다.
value = { "/username/{id:.+}" } 이 작동하지 않습니다
값 = "/username/{id:.+}" 작동
누군가를 도왔기를 바랍니다 :)
/somepath/{variable:.+}Java requestMapping태그 에서 작동합니다 .
Java 구성에 전적으로 의존하는 접근 방식은 다음과 같습니다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
@Configuration
public class MvcConfig extends WebMvcConfigurationSupport{
@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();
handlerMapping.setUseSuffixPatternMatch(false);
handlerMapping.setUseTrailingSlashMatch(false);
return handlerMapping;
}
}
이 문제를 해결하는 매우 쉬운 방법 중 하나는 후행 슬래시를 추가하는 것입니다 ...
예 :
사용하다 :
/somepath/filename.jpg/
대신에:
/somepath/filename.jpg
Spring Boot에서 정규 표현식은 다음과 같은 문제를 해결합니다.
@GetMapping("/path/{param1:.+}")
스프링 4.2의 경로 이름에 이메일 주소를 포함하는 완벽한 솔루션은
<bean id="contentNegotiationManager"
class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false" />
<property name="favorParameter" value="true" />
<property name="mediaTypes">
<value>
json=application/json
xml=application/xml
</value>
</property>
</bean>
<mvc:annotation-driven
content-negotiation-manager="contentNegotiationManager">
<mvc:path-matching suffix-pattern="false" registered-suffixes-only="true" />
</mvc:annotation-driven>
이것을 application-xml에 추가하십시오
Spring 3.2.x 및를 사용하는 경우 다음을 <mvc:annotation-driven />작성하십시오 BeanPostProcessor.
package spring;
public final class DoNotTruncateMyUrls implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof RequestMappingHandlerMapping) {
((RequestMappingHandlerMapping)bean).setUseSuffixPatternMatch(false);
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
그런 다음 MVC 구성 XML에 넣으십시오.
<bean class="spring.DoNotTruncateMyUrls" />
마지막으로 Spring Docs 에서 솔루션을 찾았습니다 .
파일 확장자 사용을 완전히 비활성화하려면 다음을 모두 설정해야합니다.
useSuffixPatternMatching(false), see PathMatchConfigurer favorPathExtension(false), see ContentNegotiationConfigurer
이것을 WebMvcConfigurerAdapter구현에 추가하면 문제가 해결되었습니다.
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false);
}
@Override
public void configurePathMatch(PathMatchConfigurer matcher) {
matcher.setUseSuffixPatternMatch(false);
}
나를 위해
@GetMapping(path = "/a/{variableName:.+}")
작동하지만 요청 URL의 "도트"를 "% 2E"로 인코딩 한 경우에만 작동합니다. 그러나 URL은 모두 필요합니다 ... 유효하지만 "표준"인코딩이 아닙니다. 버그 같은 느낌 : |
"트레일 링 슬래시"방식과 유사한 다른 해결 방법은 다음과 같이 점 "인라인"이있는 변수를 이동하는 것입니다.
@GetMapping (경로 = "/ {variableName} / a")
이제 모든 점이 유지되며 수정이나 정규식이 필요하지 않습니다.
참고 URL : https://stackoverflow.com/questions/16332092/spring-mvc-pathvariable-with-dot-is-getting-truncated
'development' 카테고리의 다른 글
| Emacs에서 글꼴 크기를 설정하는 방법은 무엇입니까? (0) | 2020.03.04 |
|---|---|
| n 번째 문자마다 문자열을 분할 하시겠습니까? (0) | 2020.03.04 |
| CamelCase를 snake_case로 변환하는 우아한 Python 함수? (0) | 2020.03.04 |
| 두 날짜를 비교하는 방법? (0) | 2020.03.03 |
| Tomcat 7에서 war 파일을 배포하는 방법 (0) | 2020.03.03 |