必须在Spring MVC中使用已弃用的类

时间:2016-03-11 01:08:26

标签: spring spring-mvc

已经试用过Spring Web MVC(4.2.5)并且尝试使用DispatcherServlet并且有很多问题

<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源我无法看到无论如何,默认和推荐的处理程序都可以工作)

没有错误,只是没有检测到注释。填充上下文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;
}
}

2 个答案:

答案 0 :(得分:1)

问题是Spring MVC匹配

中的路径
@RestController("/place/*")

因此将PlaceController的实例作为处理程序传递。 ExceptionHandlerExceptionResolver需要一个HandlerMethod,因此无法处理异常。

因此从类注释中删除路径并在方法中放入完整路径使得它全部工作,我删除了所有已弃用的bean。

@RestController
public class PlaceController {

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

我不确定这是不是一个错误。不可能把'基地'放在基地上。 RestController注释中的路径和RequestMapping中的子路径?

答案 1 :(得分:0)

据我所知,您不想使用已弃用的课程。 AnnotationMethodHandlerAdapter确实已弃用。正如文档建议您应该使用RequestMappingHandlerAdapter代替。

有关详细信息,请参阅here

而不是AnnotationMethodHandlerExceptionResolver,您可以使用ExceptionHandlerExceptionResolver