복붙노트

[SPRING] Spring - 도트 주석 뒤에 패스 변수 자름

SPRING

Spring - 도트 주석 뒤에 패스 변수 자름

전자 메일 주소로 사용자를 쿼리 할 수있는 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. ==============================

    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. ==============================

    2.이름 뒤에 경로 변수의 끝에 슬래시를 추가해야합니다.

    이름 뒤에 경로 변수의 끝에 슬래시를 추가해야합니다.

     @RequestMapping(value ="/test/{name}/")
    

    요청은 다음과 같습니다.

    http : // localhost : 8080/utooa/service/api/admin/test/Takeoff.Java@gmail.com/

  3. ==============================

    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. ==============================

    4.Java-Config 사용자 :

    Java-Config 사용자 :

    Spring 4를 사용하면 다음과 같이이 기능을 해제 할 수 있습니다.

    @Configuration
    public class WebMvcConfig extends WebMvcConfigurerAdapter {
    
      @Override
      public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setUseSuffixPatternMatch(false);
      }
    
    }
    

    그런 다음 전체 응용 프로그램에서 점들이 점으로 처리됩니다.

  5. from https://stackoverflow.com/questions/27419743/spring-path-variable-truncate-after-dot-annotation by cc-by-sa and MIT license