스프링 MVC @PathVariable이 잘립니다.
다음 정보에 대한 RESTful 액세스를 제공하는 컨트롤러가 있습니다.
@RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName}")
public ModelAndView getBlah(@PathVariable String blahName, HttpServletRequest request,
HttpServletResponse response) {
제가 겪고 있는 문제는 특수문자가 포함된 경로변수로 서버를 치면 서버가 잘리는 것입니다.예: http://localhost:8080/blah-server/blah/get/blah2010.08.19-02:25:47
파라미터 blahName은 blah2010.08이 됩니다.
단, request.getRequestURI() 호출에는 전달된 모든 정보가 포함됩니다.
스프링이 @PathVariable을 자르지 않도록 할 방법이 있나요?
여러분도 정규 을 사용해 보세요.@RequestMapping
★★★★
RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName:.+}")
이것은 SPR-6164와 밀접하게 관련되어 있을 가능성이 있습니다.간단히 말하면, 프레임워크는 파일 확장자라고 생각되는 것을 삭제하고, URI 해석에 몇개의 스마트를 적용하려고 합니다.이렇게 하면 돌게 되는 효과가 있습니다.blah2010.08.19-02:25:47
blah2010.08
「」라고 에,.19-02:25:47
을 사용하다
문제에서 와 같이 이을 비활성화하려면 자신의 해야 합니다.DefaultAnnotationHandlerMapping
및 하기.useDefaultSuffixPattern
을 property property로 설정합니다.false
그러면 기본 동작이 무시되고 데이터에 대한 추행이 중지됩니다.
점 뒤에 있는 것이 과 같은 합니다..json
★★★★★★★★★★★★★★★★★」.xml
파라미터를 취득하기 위해서 잘라냅니다.
만약에 ★★★★★★★★★★★★★★★★★★★★★★★./{blahName}
:
/param
,/param.json
,/param.xml
★★★★★★★★★★★★★★★★★」/param.anything
에서는 값 "이행"을 가 생성됩니다.param
/param.value.json
,/param.value.xml
★★★★★★★★★★★★★★★★★」/param.value.anything
에서는 값 "이행"을 가 생성됩니다.param.value
을 '하다'로 /{blahName:.+}
제시된 바와 같이 마지막 점을 포함한 모든 점이 파라미터의 일부로 간주됩니다.
/param
에서는 값 "이행"을 가 생성됩니다.param
/param.json
에서는 값 "이행"을 가 생성됩니다.param.json
/param.xml
에서는 값 "이행"을 가 생성됩니다.param.xml
/param.anything
에서는 값 "이행"을 가 생성됩니다.param.anything
/param.value.json
에서는 값 "이행"을 가 생성됩니다.param.value.json
- ...
인식이 없는 내선번호 인식을 할 수 .mvc:annotation-driven
동동: :
<bean id="handlerMapping"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="contentNegotiationManager" ref="contentNegotiationManager"/>
<property name="useSuffixPatternMatch" value="false"/>
</bean>
그러니까다시말씀드리지만,/{blahName}
:
/param
,/param.json
,/param.xml
★★★★★★★★★★★★★★★★★」/param.anything
에서는 값 "이행"을 가 생성됩니다.param
/param.value.json
,/param.value.xml
★★★★★★★★★★★★★★★★★」/param.value.anything
에서는 값 "이행"을 가 생성됩니다.param.value
는 다음과 같은 됩니다./something.{blahName}
Resthub 프로젝트의 문제를 참조해 주세요.
확장 관리를 유지할 경우 Spring 3.2 이후 RequestMappingHandlerMapping bean의 useRegisteredSuffixPatternMatch 속성을 설정하여 suffixPattern 인식을 활성화하지만 등록된 내선으로 한정할 수도 있습니다.
여기서는 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:drivation-driven은 커스텀빈을 제공하기 위한 contentNegotiation 옵션을 받아들이지만 RequestMappingHandlerMapping 속성을 true(기본값 false)로 변경해야 합니다(cf. https://jira.springsource.org/browse/SPR-7632)).
따라서 mvc:notation-driven 구성을 모두 재정의해야 합니다.커스텀 Request Mapping Handler Mapping을 요청하기 위해 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 config xml 을 추가할 수 .DefaultAnnotationHandlerMapping
를 설정합니다.useDefaultSuffixPattern
로로 합니다.false
는 ( ( ) 。true
를 참조해 주세요.
xml spring xml을 .mvc-config.xml
어떤 되어도) add ('어느 쪽으로 호출되어도)
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="useDefaultSuffixPattern" value="false" />
</bean>
당신의 ★★★★★★★★★★★★★★★★★.@PathVariable
blahName
(다른 모든 것도 포함)는 모든 점을 포함한 전체 이름을 포함해야 합니다.
편집: 다음은 spring api 링크입니다.
올바른 Java 컨피규레이션클래스 사용:
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter
{
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer)
{
configurer.favorPathExtension(false);
}
@Override
public void configurePathMatch(PathMatchConfigurer configurer)
{
configurer.setUseSuffixPatternMatch(false);
}
}
저도 같은 문제에 부딪혔는데 속성을 false로 설정해도 도움이 되지 않았습니다.단, API에는 다음과 같이 표시됩니다.
".xx" 서픽스를 포함하거나 "/"로 끝나는 경로는 기본 서픽스 패턴을 사용하여 변환되지 않습니다.
RESTful URL에 "/end"를 추가하려고 했는데 문제가 해결되었습니다.그 해결책이 마음에 들지 않지만 효과가 있었다.
그나저나 스프링 디자이너들이 이 "기능"을 추가하고 기본 기능을 켰을 때 무슨 생각을 했는지 모르겠습니다.IMHO야, 이거 빼야 돼.
는 이 으로 해결했다.
1) 다음과 같이 @PathVariable에 HttpServletRequest 추가
@PathVariable("requestParam") String requestParam, HttpServletRequest request) throws Exception {
2) 요청 내 URL을 직접 취득한다(이 레벨에서는 잘라내지 않는다).
request.getPathInfo()
스프링 MVC @PathVariable with 닷(.)이 잘려나가고 있습니다.
":"를 추가합니다.+"는 동작했지만, 외측 곱슬 괄호를 떼어낼 때까지는 동작하지 않았습니다.
value = {"/username/{id:.+}"}
작동하지 않았다
value = "/username/{id:.+}"
작동하다
내가 누군가를 도왔길 바래 :]
방금 이 문제에 부딪혔는데, 이곳의 솔루션은 일반적으로 기대했던 대로 작동하지 않았습니다.
예를 들어 SpEL 식과 여러 매핑을 사용하는 것이 좋습니다.
@RequestMapping(method = RequestMethod.GET,
value = {Routes.BLAH_GET + "/{blahName:.+}",
Routes.BLAH_GET + "/{blahName}/"})
파일 확장자 문제는 매개 변수가 URL의 마지막 부분에 있는 경우에만 발생합니다. 변경
@RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName}")
로.
@RequestMapping(
method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName}/safe")
그러면 모든 게 다시 좋아질 거야
요구가 송신되는 주소를 편집할 수 있는 경우, 간단한 수정은 요구에 후행 슬래시를 추가하는 것입니다(또한@RequestMapping
값):
/path/{variable}/
매핑은 다음과 같습니다.
RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName}/")
Spring MVC @PathVariable with 도트(.)가 잘리고 있는 것도 참조해 주세요.
//in your xml dispatcher add this property to your default annotation mapper bean as follow
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="alwaysUseFullPath" value="true"></property>
</bean>
이 문제는 스프링이 닷(.) 뒤의 마지막 부분을 .json이나 .xml과 같은 파일 확장자로 해석하기 때문입니다.따라서 스프링이 경로 변수를 해결하려고 하면 uri 끝에 점(.)이 있는 경우 나머지 데이터가 잘라집니다.주의: 이 또한 경로 변수를 URI 끝에 유지한 경우에만 발생합니다.
예를 들어 uri:https://localhost/syslog/syslog.df/link.ar를 고려합니다.
@RestController
public class CustomController {
@GetMapping("/example/{firstValue}/{secondValue}")
public void example(@PathVariable("firstValue") String firstValue,
@PathVariable("secondValue") String secondValue) {
// ...
}
}
위의 url firstValue = "secondValue="link"에서 경로 변수가 해석될 때 . 뒤의 마지막 비트가 잘립니다.
이를 방지하기 위해 다음 두 가지 방법이 있습니다.
1) regexp 매핑 사용
매핑 끝 부분에 정규식 사용
@GetMapping("/example/{firstValue}/{secondValue:.+}")
public void example(
@PathVariable("firstValue") String firstValue,
@PathVariable("secondValue") String secondValue) {
//...
}
+ 를 사용하면 점 뒤의 값도 경로 변수의 일부가 됩니다.
2) @PathVariable 끝에 슬래시 추가
@GetMapping("/example/{firstValue}/{secondValue}/")
public void example(
@PathVariable("firstValue") String firstValue,
@PathVariable("secondValue") String secondValue) {
//...
}
스프링의 기본 동작으로부터 보호하는 두 번째 변수를 포함합니다.
3) Spring 기본 webmvc 구성을 덮어쓰기
스프링은 @EnableWebMvc 주석을 사용하여 Import되는 기본 구성을 재정의하는 방법을 제공합니다.애플리케이션 컨텍스트에서 자체 DefaultAnnotationHandlerMapping bean을 선언하고 useDefaultSuffixPattern 속성을 false로 설정하면 Spring MVC 설정을 맞춤화할 수 있습니다.예:
@Configuration
public class CustomWebConfiguration extends WebMvcConfigurationSupport {
@Bean
public RequestMappingHandlerMapping
requestMappingHandlerMapping() {
RequestMappingHandlerMapping handlerMapping
= super.requestMappingHandlerMapping();
handlerMapping.setUseSuffixPatternMatch(false);
return handlerMapping;
}
}
이 디폴트 설정을 덮어쓰면, 모든 URL 에 영향을 주는 것에 주의해 주세요.
주의: 여기서는 WebMvcConfigurationSupport 클래스를 확장하여 기본 메서드를 덮어씁니다.WebMvcConfigurer 인터페이스를 구현하여 디폴트 설정을 덮어쓰는 방법이 하나 더 있습니다.상세한 것에 대하여는, https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/EnableWebMvc.html 를 참조해 주세요.
(비사용 클래스 사용) 절단을 방지하기 위한 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 PolRepWebConfig extends WebMvcConfigurationSupport {
@Override
@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
final RequestMappingHandlerMapping handlerMapping = super
.requestMappingHandlerMapping();
// disable the truncation after .
handlerMapping.setUseSuffixPatternMatch(false);
// disable the truncation after ;
handlerMapping.setRemoveSemicolonContent(false);
return handlerMapping;
}
}
출처 : http://www.javacodegeeks.com/2013/01/spring-mvc-customizing-requestmappinghandlermapping.html
갱신:
상기의 어프로치를 사용했을 때에, Spring Boot 자동 설정에 문제가 있는 것을 알았습니다(일부 자동 설정이 유효하게 되지 않는 경우도 있습니다).
나는 ㅇㅇㅇㅇ, , 는, 퓨, 퓨, insteadBeanPostProcessor
it.잘 되는 것요.더 잘 작동하는 것 같았어요.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
private static final Logger logger = LoggerFactory
.getLogger(MyBeanPostProcessor.class);
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
if (bean instanceof RequestMappingHandlerMapping) {
setRemoveSemicolonContent((RequestMappingHandlerMapping) bean,
beanName);
setUseSuffixPatternMatch((RequestMappingHandlerMapping) bean,
beanName);
}
return bean;
}
private void setRemoveSemicolonContent(
RequestMappingHandlerMapping requestMappingHandlerMapping,
String beanName) {
logger.info(
"Setting 'RemoveSemicolonContent' on 'RequestMappingHandlerMapping'-bean to false. Bean name: {}",
beanName);
requestMappingHandlerMapping.setRemoveSemicolonContent(false);
}
private void setUseSuffixPatternMatch(
RequestMappingHandlerMapping requestMappingHandlerMapping,
String beanName) {
logger.info(
"Setting 'UseSuffixPatternMatch' on 'RequestMappingHandlerMapping'-bean to false. Bean name: {}",
beanName);
requestMappingHandlerMapping.setUseSuffixPatternMatch(false);
}
}
출처: http://ronaldxq.blogspot.com/2014/10/spring-mvc-setting-alwaysusefullpath-on.html
텍스트가 기본 확장자와 일치하지 않을 경우 다음 코드를 사용할 수 있습니다.
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseRegisteredSuffixPatternMatch(true);
}
}
Spring MVC @PathVariable이 잘리지 않도록 하려면 경로 변수 끝에 후행 슬래시를 추가하는 것이 좋습니다.
예를 들어 다음과 같습니다.
@RequestMapping(value ="/email/{email}/")
따라서 요청은 다음과 같습니다.
http://localhost:8080/api/email/test@test.com/
언급URL : https://stackoverflow.com/questions/3526523/spring-mvc-pathvariable-getting-truncated
'source' 카테고리의 다른 글
MySQL - 구조가 같지만 데이터가 다른 여러 테이블에서 데이터 선택 (0) | 2022.11.25 |
---|---|
무선상의 ADB (0) | 2022.11.25 |
sst:xtrabackup(galera) 사용 시 노드가 클러스터에 가입하는 문제 (0) | 2022.11.16 |
Eclipse/Java 코드 완료가 작동하지 않음 (0) | 2022.11.16 |
Python 테스트 없음 (0) | 2022.11.16 |