2010-12-07 17 views
5

Tengo un número de controladores con varios manejadores de solicitudes en mi proyecto Spring 3.x (todos basados ​​en anotaciones, usando @Controller y @RequestMapping).Configuración de una configuración mixta para controladores Spring MVC basados ​​en anotación

Actualmente, el contexto de la aplicación solo define DefaultAnnotationHandlerMapping y AnnotationMethodHandlerAdapter beans. Si lo entiendo correctamente, estos también podrían reemplazarse por <mvc:annotation-driven/>.
Los controladores existentes en su mayoría llenan un modelo que se pasa a través de los parámetros y luego devuelven un nombre de vista como una cadena. El mapeo se realiza por estándar DefaultRequestToViewNameTranslator y InternalResourceViewResolver frijoles.

Ahora me gustaría presentar un nuevo controlador, que necesita un HttpMessageConverter (será un MappingJacksonHttpMessageConverter) y un HandlerExceptionResolver específico para este controlador.

Los controladores existentes no deberían verse afectados de ninguna manera. El convertidor de mensajes tampoco debe convertir sus solicitudes y respuestas, ni el solucionador de excepciones debe manejar ninguna excepción.


¿Hay alguna manera de hacer esto sin descartar la configuración basada en anotaciones para el nuevo controlador? ¿Hay alguna manera de configurar el convertidor de mensajes y el sistema de resolución de excepciones específicamente para un controlador, sin renunciar al enrutamiento de URL basado en @RequestMapping?

¿O hay alguna forma de elegir una configuración de convertidor/resolver con una anotación en el controlador?

Si no, ¿cuál es el siguiente mejor enfoque para hacer esto?

+0

@RequestMapping se utiliza casi exclusivamente en los métodos, todavía no lo he visto usado en la clase de un controlador en este proyecto. Realmente no hay nada interesante en el contexto de la aplicación. Son solo declaraciones estándar/vacías de DefaultRequestToViewNameTranslator, InternalResourceViewResolver, DefaultAnnotationHandlerMapping, AnnotationMethodHandlerAdapter. –

Respuesta

1

Si anota su método con @ExceptionHandler como se indica here, solo manejará las excepciones arrojadas por los métodos del controlador donde se coloca. Por lo tanto, no afectará a los demás.

En cuanto a HttpMessageConverter, no estoy seguro de si lo que voy a decir se puede aplicar a HttpMessageConverter (porque nunca lo he usado y no estoy seguro si se puede tratar como otros convertidores), pero si puede crear un conversionService con ella se podría hacer algo como esto en el controlador:

@Autowired 
private ConversionService conversionService; 

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

y la conversionService solo se aplicará el método de controlador de esta initBinder.

+0

Buena idea con el uso de @ExceptionHandler en este caso, eso es justo lo que necesito.El servicio de conversión, sin embargo, creo que no está relacionado con HttpMessageConverter. ConversionService es spring-core, HttpMessageConverter es spring-web. –

0

En el caso especial de que no hay superposición de tipos de medios entre los controladores (por ejemplo, uno acepta y responde únicamente con JSON, todos los demás a recibir/responder con XML), se puede confiar en el juego Content-Type y Accept cabecera de la primavera de haga la asignación al HttpMessageConverter correspondiente por usted.

Esto no resuelve la pregunta original, sin embargo. Es solo una solución si tienes la suerte de estar en esta situación especial. Tampoco puede evitar que un controlador entienda/responda con un tipo de medio que no debería soportar de esta manera.

Cuestiones relacionadas