我正在尝试重构当前正在使用 CXFServlet 的应用程序,以将调度程序 servlet 用于 REST API 请求。
我在web中创建了一个servlet和servlet映射.xml:
<servlet>
<servlet-name>api</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>api</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
然后我创建了一个 api-servlet.xml它:
<context:component-scan base-package="org.myapp.api"></context:component-scan>
<context:annotation-config/>
<tx:annotation-driven/>
<mvc:annotation-driven />
最后,我在适当的包中创建了一个新控制器:
@Controller("eventsController")
@RequestMapping("/api/events")
public class EventsController {
private static final Logger LOGGER = LogUtils.getLogger();
@GET
@Path("/{eventId}")
public EventDto getEvent(@PathParam("eventId") Long eventId) {
//do controller stuff
}
@GET
@Path("/")
public List<EventDto> getEvents() {
//do controller stuff
}
}
应用程序启动正常,我初始化了servlet,找到了事件控制器bean,我没有收到任何错误。但是,在尝试命中其余端点时,我收到一个错误:
Apr 17, 2015 11:02:27 AM org.springframework.web.servlet.DispatcherServlet noHandlerFound
WARNING: No mapping found for HTTP request with URI [/api/events/42] in DispatcherServlet with name 'api'
我已经浏览了其他几篇带有此错误的帖子,但尚未找到解决方案。
谢谢。
Ok 终于想通了——@GET和@Path注释对于 CFXServlet 实现是正确的,但对于香草 Spring 来说则不然,我需要将注释更改为 @RequestMapping(value="/{eventId}",method=RequestMethod.GET),然后一切正常。我最终还将控制器注释更改为@RestController,但它与以前的注释配合得很好。