복붙노트

[SPRING] 봄 mvc 3.1 사용자 지정 RequestCondition 추가

SPRING

봄 mvc 3.1 사용자 지정 RequestCondition 추가

Spring mvc (3.1.1) 응용 프로그램이 있고 RequestMapping에서 사용할 수있는 것 이상의 조건을 정의하고 싶습니다. 나는 그것을 사용하고 싶은 몇 가지를 가지고있다.

첫째, 다른 사용자 유형에 대해 다른 홈 페이지를 표시 할 수 있다면 좋을 것입니다.

@Controller
public class HomepageController {

    @RequestMapping(value = "/")
    @CustomCondition(roles = Guest.class)
    public String guestHome() { /*...*/ }

    @RequestMapping(value = "/")
    @CustomCondition(roles = Admin.class)
    public String adminHome() { /*...*/ }

}

둘째, 앱을 웹 사이트와 REST 서비스 (예 : 모바일 앱) 둘 다로 작동하도록하려면 웹 사이트에서 html 및 json 작업에 모두 액세스하도록하고 서비스 (다른 하위 도메인) 만 허용하도록하고 싶습니다. json 작업에 액세스 (웹 사이트 URL과 일치하는 @CustomCondition (web = true))

이 두 가지 용도로 사용할 수 있습니까?

사용자 지정 조건에 대한 문서는 거의 찾지 못했지만 원하는대로 사용자 지정 조건을 구현하는 예제를 찾았지만 사용하고있는 XML 구성 대신 @Configuration 클래스를 사용합니다. 내 전체 spring xml 정의를 @Configuration 클래스로 이동하십시오.

RequestMappingHandlerMapping에 대한 customMethodCondition을 XML로 정의 할 수 있습니까?

RequestMappingHandlerMapping을 서브 클래스 화하고 getCustomMethodCondition을 재정의하여 내 사용자 정의 RequestCondition을 리턴하려고 시도했지만 작동하지 않았습니다. - 내 조건에서 getMatchingCondition ()이 실행되지 않았습니다.

어떤 도움이라도 대단히 감사하겠습니다!

최신 정보

좀 더 읽고, RequestMappingHandlerMapping이 새로운 클래스 (ver 3.1 이후) 인 것처럼 보입니다.

내 애플 리케이션에서 일어나는 일은 requestMappingHandlerMapping 빈을 재정의하고 다시 정의하려고하는 @Configuration이 실제로 작동하지만 URL 매핑 (@Controllers의 @RequestMapping 메서드)이 ExtendedRequestMappingHandlerMapping의 하위 클래스에 의해 한 번, 두 번 처리 된 것처럼 보입니다. 원래 RequestMappingHandlerMapping - 먼저 사용자 지정 조건을 사용하고 다시 사용자 지정 조건을 사용하지 않습니다.

결론은 내 사용자 정의 조건은 단순히 무시됩니다.

이것은 고급 패턴이 있어야하지만, IMO는 꽤 일반적이어야합니다 ...

누구에게 코멘트 하시겠습니까?

해결법

  1. ==============================

    1.Spring MVC는 이미 json과 html을 구별하는 메커니즘을 제공하고 RequestMapping 어노테이션은 요청의 컨텐츠 유형을 보는 consumes 속성을 취한다.

    Spring MVC는 이미 json과 html을 구별하는 메커니즘을 제공하고 RequestMapping 어노테이션은 요청의 컨텐츠 유형을 보는 consumes 속성을 취한다.

    // REST version, Content-type is "application/json"
    @RequestMapping(value = "/", consumes = "application/json")
    public void myRestService() {
    ...
    
    // HTML version, Content-type is not "application/json"
    @RequestMapping(value = "/", consumes = "!application/json")
    public void myHtmlService() {
    ...
    

    동일한 URL을 사용하지만 별개의 메소드를 사용하는 또 다른 방법은 param 또는 headers 속성을 사용하는 것입니다.

    // the url is /?role=guest
    @RequestMapping(value = "/", param = "role=guest")
    public void guestService() {
    
    // the url is / with header role=admin
    @RequestMapping(value = "/", headers = "role=admin")
    public void adminService() {
    

    나는 당신이 보안을위한 별개의 URL을 원할 것이라고 생각한다. 일반적으로 Spring Security와 같은 기능을 사용하면 admin 기능을 / admin 아래에 두어 프레임 워크가 모든 것을 관리하도록합니다.

    <http auto-config="true">
      <intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
    ...
    

    귀하의 유스 케이스에 이것으로 충분합니까?

  2. ==============================

    2.RequestMappingHandlerMapping (ExtendedRequestMappingHandlerMapping)을 확장했다면이 새로운 매핑을 애플리케이션 컨텍스트 xml에 약간 다르게 등록해야합니다.

    RequestMappingHandlerMapping (ExtendedRequestMappingHandlerMapping)을 확장했다면이 새로운 매핑을 애플리케이션 컨텍스트 xml에 약간 다르게 등록해야합니다.

    내부 MVC를 정의하기 위해 을 사용할 수 없습니다. 내부적으로 handlerMapping을 정의하기 때문에, 대신이 라인을 따라 무엇인가를 할 수 있습니다 (또는 제공 한 @Configuration 링크를 따라갈 수도 있습니다) :

    <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>
                <property name="validator">
                    <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
                </property>
            </bean>
        </property>
        <property name="messageConverters">
            <list>
                <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>
            </list>
        </property>
    </bean>
    
    <bean name="handlerMapping" class="..ExtendedRequestMappingHandlerMapping">
    </bean>
    

    이렇게하면 매핑이 적용되고 handlerAdapter 구성 요소에서 적절한 핸들러 메서드를 찾을 수 있습니다.

  3. from https://stackoverflow.com/questions/10073695/adding-custom-requestconditions-in-spring-mvc-3-1 by cc-by-sa and MIT license