在Spring MVC

时间:2015-12-03 22:56:21

标签: spring rest spring-mvc exception-handling message

我试图覆盖WebMvcConfigurerAdapter.configureHandlerExceptionResolvers()并向Spring MVC提供我自己的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

当我将@Qualifier注释添加到我的ErrorContentNegotiationStrategy类并为其指定唯一名称时,它不起作用。抛出相同的异常。

如果我删除@Compoenent注释并保持代码不变,则不会调用ErrorContentNegotiaionStrategy中的ErrorContentNegotiationStrategy()方法。

有没有人面对这个问题?

2 个答案:

答案 0 :(得分:0)

@Primary注释添加到mvn -f /path/to/pom.xml 类:

  

表示当多个候选者有资格自动装配单值依赖项时,应优先考虑bean。如果候选者中只存在一个“主”bean,则它将是自动装配的值。

这应该至少解决启动期间的异常。

答案 1 :(得分:0)

在调试问题之后,我发现我正在尝试加载2个相同类型的bean(这是错误信息所说的。其中一个bean是实际实现,另一个是模拟测试用例。由于两者都存在在同一个包中@component扫描了基本包,无法决定加载哪个。我通过使用@profile解决了这个问题,这有助于根据你加载的配置文件加载bean。我使用了两个配置文件,一个用于测试和一个用于发展。