2016-03-11 3 views
1

Были пробное Spring Web MVC (4.2.5) и иметь свой ряд вопросов, которые пытаются использовать DispatcherServlet иИмея использовать устаревшие классы с Spring MVC

<mvc:annotation-driven /> 

есть установка простой класс @Controller и хотел использовать сопоставление POJO для JSON. Доку сказал, что если Джексон был обнаружен на пути класса он будет использоваться автоматически, однако это не работает для меня, и я был вынужден использовать «устаревшую» AnnotationMethodHandlerAdapter

<bean name="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" /> 

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" > 
    <property name="messageConverters" ref="mappingJackson2HttpMessageConverter"/> 
</bean> 

, который затем работал хорошо.

В равной степени попытался создать класс @ControllerAdvice для обработки всех исключений, но получил только метод @ExceptionHandler, работающий над одним и тем же классом контроллера, и это было только тогда, когда я добавил (снова) устаревший AnnotationMethodHandlerExceptionResolver в контекст.

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver" /> 

Имея в два экземпляра устаревших классов предполагает, что я делаю что-то неправильно, особенно когда все учебники, кажется, предлагают все это должно «просто работать», но я не могу видеть, что (и на самом деле совать через источник Spring I не могут видеть, как по умолчанию и рекомендуемые обработчики будут работать в любом случае)

Ошибок нет, аннотация просто не обнаружена. Контекст заполнения XML является

пожалуйста, найти весь контекст XML ниже (очень простой)

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:p="http://www.springframework.org/schema/p" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 

<mvc:annotation-driven enable-matrix-variables="true"/> 

<bean name="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" /> 

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" > 
    <property name="messageConverters" ref="mappingJackson2HttpMessageConverter"/> 
</bean> 

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver" /> 

<context:component-scan base-package="com.domain.datastore.dao"/> 

<context:component-scan base-package="com.domain.service"/> 

<context:component-scan base-package="com.domain.uiapi"/> 

</beans> 

Пример контроллер

@RestController("/place/*") 
public class PlaceController { 

private PlaceService placeService; 

@Autowired 
public PlaceController(PlaceService placeService) { 
    this.placeService = placeService; 
} 

@RequestMapping(path="/{id}", method = RequestMethod.GET) 
public @ResponseBody Place getPlace(@PathVariable("id") long id, Model model) { 
    return placeService.getPlace(id); 
} 


} 

и обработчик сквозного исключения

@ControllerAdvice 
public class GlobalExceptionController { 

public GlobalExceptionController() { 
    System.out.println("GlobalExceptionController"); 
} 

@ResponseStatus(HttpStatus.NOT_FOUND) 
@ExceptionHandler(NotFoundException.class) 
public ModelAndView handleCustomException(NotFoundException ex) { 
    return null; 
} 
} 
+1

Пожалуйста, включите журналы ошибок – Bnrdo

+0

Можете ли вы подробно остановиться на том, что не сработало? Получили ли вы сообщение об ошибке?Запустилось ли приложение или нет? –

+0

Было бы немного более ясно, если бы вы предоставили полный код вашей xml-конфигурации. –

ответ

1

Вопрос заключается в том, что Spring MVC было соответствие пути в

@RestController("/place/*") 

и как таковой проходя экземпляр PlaceController вокруг как обработчик. ExceptionHandlerExceptionResolver ожидает HandlerMethod и поэтому не смог обработать исключение.

Как таковой, отбрасывая путь из аннотации класса и помещая полный путь в метод, все это работает, и я сбросил все устаревшие бобы.

@RestController 
public class PlaceController { 

@RequestMapping(path="/place/{id}", method = RequestMethod.GET) 
public @ResponseBody Place getPlace(@PathVariable("id") long id, Model model) 

Что я не уверен, если это ошибка. Нельзя ли поместить «базовый» путь в аннотацию RestController и подпуть в RequestMapping?

+0

Значение '@ RestController' - это не путь, это имя компонента. Если вы хотите поместить путь на уровне класса, используйте '@ RequestMapping' для типа. –

0

Насколько я понимаю, вы не хотите использовать устаревший класс. AnnotationMethodHandlerAdapter действительно устарел. В качестве документа рекомендуется использовать RequestMappingHandlerAdapter.

Для получения дополнительной информации см. here.

И вместо AnnotationMethodHandlerExceptionResolver вы можете использовать ExceptionHandlerExceptionResolver.

+0

Если вы посмотрите на источник ExceptionHandlerExceptionResolver, вы увидите, что он хранит класс, помеченный аннотацией ControllerAdvice в переменной exceptionHandlerAdviceCache, но затем полностью игнорирует его в shouldApplyTo при определении того, может ли он обрабатывать исключение. Я не вижу, как ExceptionHandlerExceptionResolver фактически поддерживает аннотацию ControllerAdvice – Matt

+0

@Matt, может быть, ваш класс '@ ControllerAdvice' не будет выбран с помощью проверки компонентов? в каком пакете? –

+0

@Matt Следует отметить, что наличие '' должно приводить к созданию «ExceptionHandlerExceptionResolver» по умолчанию. Не нужно указывать его вручную. –

Смежные вопросы