我需要停止处理接口上的Spring注释,但是应该为这个接口创建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);
}
}
发布于 2016-06-08 11:41:22
通过创建新的注释来解决该问题,该注释用于标记API接口和重写org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
的org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
方法。该方法最初检查类(或类实现的任何接口)是否带有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);
}
};
}
}
发布于 2016-06-08 11:47:17
您可以将注释移到实现中,并将接口保持为纯java。
https://stackoverflow.com/questions/37523595
复制相似问题