[英]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)
方法。 此方法最初检查类(或类实现的任何接口)是否使用Controller
或RequestMapping
注释进行批注。 我添加了额外的检查,查找我的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.