为基于注释的Spring MVC控制器设置混合配置

时间:2010-12-07 13:56:44

标签: java spring spring-mvc

我的Spring 3.x项目中有许多带有各种请求处理程序的控制器(所有基于注释的,使用@Controller@RequestMapping)。

目前,应用程序上下文只定义了DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter bean。如果我理解正确,也可以用<mvc:annotation-driven/>替换它们 现有的控制器主要填充通过参数传入的模型,然后将视图名称作为字符串返回。映射由标准DefaultRequestToViewNameTranslatorInternalResourceViewResolver bean完成。

现在我想介绍一个新控制器,它需要HttpMessageConverter(它将是MappingJacksonHttpMessageConverter)和HandlerExceptionResolver特定于此控制器。

不应以任何方式影响现有控制器。它们的请求和响应都不应由消息转换器转换,异常解析器也不应处理任何异常。


有没有办法在不删除新控制器的基于注释的配置的情况下执行此操作?有没有办法专门为一个控制器设置消息转换器和异常解析器,而不放弃基于@RequestMapping的URL路由?

或者有没有办法在控制器上使用注释选择转换器/解析器配置?

如果没有,那么下一个最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

如果使用@ExceptionHandler注释您的方法,因为它已声明为here,它将仅处理放置它的控制器方法抛出的异常。所以它不会影响其他的。

关于HttpMessageConverter,我不确定我要说的是否可以应用于HttpMessageConverter(因为我从未使用它,我不确定它是否可以被视为其他转换器),但是如果你可以用它创建一个conversionService你可以在控制器中做这样的事情:

@Autowired
private ConversionService conversionService;

@InitBinder
public void initBinder(WebDataBinder binder){
    binder.setConversionService(conversionService);
}

并且conversionService将仅应用于此initBinder的控制器方法。

答案 1 :(得分:0)

在特殊情况下,控制器之间没有媒体类型重叠(例如,一个接受并仅响应JSON,其他所有接收/响应XML),您可以依赖Content-Type和{{1 Spring的标头匹配为你做映射到相应的HttpMessageConverter。

但这并不能解决原始问题。如果您足够幸运能够处于这种特殊情况,这只是一种解决方法。您也无法阻止一个控制器以不应该支持的媒体类型取消发送/响应。