繁体   English   中英

停止Spring MVC注释处理

[英]Stop Spring MVC annotations processing

我需要在接口上停止处理Spring MVC注释,但是应该创建用于此接口的bean。 例如,我已经与MVC REST注释共享Api接口,Controller实现了这个Api。 在其他项目中,我基于接口创建REST客户端(通过处理注释)。 但是当我创建客户端时,Spring将接口视为返回类型并在其中处理注释。 因此,我需要在创建REST客户端时停止注释处理,但是对于控制器注释应该有效(现在它们可以正常工作)。

@RequestMapping("/resource1")
public interface Api {
    @RequestMapping(method = RequestMethod.POST)
    Resource1 getResource1();
}

@RestController
public class Controller implements Api {
    @Override
    public Resource1 getResource1() {
         return null;
    }
}

@Configuration
public class Config {
    @Bean
    public Api api() {
         return RestClientFactory.createRestClientBasedOnAnnotations(Api.class);
    }
}

我通过创建新的注释来解决它,该注释用于标记API接口并覆盖org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping boolean isHandler(Class<?> beanType)方法。 此方法最初检查类(或类实现的任何接口)是否使用ControllerRequestMapping注释进行批注。 我添加了额外的检查,查找我的BackEndApiInterface注释,如果找到它,则返回false 这是代码:

@Retention(RetentionPolicy.RUNTIME)
public @interface BackEndApiInterface {
}

@BackEndApiInterface 
@RequestMapping("/resource1")
public interface Api {
    @RequestMapping(method = RequestMethod.POST)
    Resource1 getResource1();
}

@RestController
public class Controller implements Api {
    @Override
    public Resource1 getResource1() {
        return null;
    }
}

@Configuration
public class Config {
    @Bean
    public Api api() {
         return RestClientFactory.createRestClientBasedOnAnnotations(Api.class);
    }

    @Bean
    public static RequestMappingHandlerMapping requestMappingHandlerMapping() {
        return new RequestMappingHandlerMapping() {
            @Override
            protected boolean isHandler(Class<?> beanType) {
                if (AnnotationUtils.findAnnotation(beanType, BackEndApiInterface.class) != null) {
                    return false;
                }
                return super.isHandler(beanType);
            }
        };
    }
}

您可以将注释移动到实现,并将接口保持为纯java。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM