我试图覆盖WebMvcConfigurerAdapter.configureHandlerExceptionResolvers(),并向Spring提供自己的ExceptionHandlerExceptionResolver。这样做的动机是提供自定义内容协商,如果用户请求“接受”标题中的任何垃圾,我可以用“媒体不支持的异常”返回JSON响应。我部分地能够使用下面的设置来完成配置。
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
ContentNegotiationManager contentNegotiationManager = new ContentNegotiationManager(new ErrorContentNegotiation());
ExceptionHandlerExceptionResolver exceptionHandlerExceptionResolver = exceptionHandlerExceptionResolver();
exceptionHandlerExceptionResolver.setContentNegotiationManager(contentNegotiationManager);
exceptionHandlerExceptionResolver.afterPropertiesSet();
exceptionResolvers.add(exceptionHandlerExceptionResolver);
}
@Bean
public ExceptionHandlerExceptionResolver exceptionHandlerExceptionResolver() {
List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
messageConverters.add(getHttpMessageConverter());
ExceptionHandlerExceptionResolver exceptionHandlerExceptionResolver = new ExceptionHandlerExceptionResolver();
exceptionHandlerExceptionResolver.setMessageConverters(messageConverters);
return exceptionHandlerExceptionResolver;
}public class ErrorContentNegotiationStrategy implements ContentNegotiationStrategy {
@Override
public List<MediaType> resolveMediaTypes(final NativeWebRequest webRequest) {
return Lists.newArrayList(Globals.JSON);
}
}春天开始的时候,我会得到这个例外。
No qualifying bean of type [org.springframework.web.accept.ContentNegotiationStrategy] is defined: expected single matching bean but found 2: errorContentNegotiationStrategy,mvcContentNegotiationManager当我向我的ErrorContentNegotiationStrategy类添加一个@限定符注释并给它一个唯一的名称时,它就不能工作了。抛出同样的异常。
如果删除@Compoenent注释并保留代码原样,则不会调用ErrorContentNegotiaionStrategy中的ErrorContentNegotiaionStrategy()方法。
有人面对过这个问题吗?
发布于 2015-12-04 00:22:53
将@Primary注释添加到ErrorContentNegotiationStrategy类中:
指示当多个候选人有资格自动创建单个值依赖时,应优先考虑bean。如果候选人中确实存在一个“主”bean,那么它就是自动设置的值。
这至少应该解决启动期间的异常。
发布于 2015-12-17 04:26:26
调试该问题后,我发现我试图加载2个相同类型的bean(错误消息就是这么说的)。其中一个bean是实际实现,另一个是测试用例模拟。因为这两个包都位于同一个包中,@组件扫描了基本包,无法决定加载哪个包。我通过使用@profile解决了这个问题,这有助于根据您加载的概要文件加载bean。我使用了两个概要文件,一个用于测试,一个用于开发。
https://stackoverflow.com/questions/34077828
复制相似问题