Spring调用错误的控制器映射
问题内容:
我正在用Spring构建非常基本的mvc应用程序。它具有一个控制器,该控制器应在请求主体上调用验证。问题是,如果我在web.xml中定义映射,它将停止寻找合适的控制器,但是当我修改servlet应用程序上下文时,Spring
star迅速进行了一些新的绑定,但是这次基于注释的验证被忽略了。在仍然调用基于注释的验证时,如何控制web.xml中的映射?
详细信息如下:
控制器:
@Controller
@RequestMapping("/api")
public class UserActionsController {
@RequestMapping(value="/choice", method = RequestMethod.POST)
public @ResponseBody NameValue addUserChoice(@Valid @RequestBody NameValue action)
{
return action;
}
}
这是servlet应用程序上下文:
<mvc:annotation-driven/>
<context:component-scan base-package="com.my.package" />
<bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
</map>
</property>
<property name="defaultContentType" value="application/json" />
<property name="defaultViews">
<list>
<bean
class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
</list>
</property>
</bean>
Web xml:
<servlet>
<servlet-name>action-api</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action-api</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
上面的配置正在运行。 当我尝试更改web.xml时,问题就开始了,因此控制器仅负责“ / api / *”。我将其更改为<url- pattern>/api/*</url-pattern>
。在那种情况下,Spring找不到合适的控制器。
(DispatcherServlet:819) - DispatcherServlet with name 'action-api' processing POST request for [/api/choice]
(RequestMappingHandlerMapping:209) - Looking up handler method for path /choice
(RequestMappingHandlerMapping:219) - Did not find handler method for [/choice]
(PageNotFound:1080) - No mapping found for HTTP request with URI [/api/choice] in DispatcherServlet with name 'action-api'
(DispatcherServlet:913) - Successfully completed request
修改Servlet应用程序上下文有帮助,Spring现在可以找到控制器,但是不再调用验证。
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="alwaysUseFullPath" value="true" />
<property name="messageConverters">
<util:list id="beanList">
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
</util:list>
</property>
</bean>
<bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="alwaysUseFullPath" value="true" />
</bean>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="alwaysUseFullPath" value="true" />
</bean>
这是日志:
(DispatcherServlet:819) - DispatcherServlet with name 'action-api' processing POST request for [/api/choice]
(RequestMappingHandlerMapping:209) - Looking up handler method for path /choice
(RequestMappingHandlerMapping:219) - Did not find handler method for [/choice]
(DefaultAnnotationHandlerMapping:124) - Mapping [/api/choice] to HandlerExecutionChain with handler [com.my.package.controller.UserActionsController@1f86dbd] and 1 interceptor
(HandlerMethodInvoker:638) - Reading [com.my.package.model.NameValue] as "application/json" using [org.springframework.http.converter.json.MappingJacksonHttpMessageConverter@2059ef]
(HandlerMethodInvoker:173) - Invoking request handler method: public com.my.package.model.NameValue com.citypath.dima.controller.UserActionsController.addUserChoice(com.my.package.model.NameValue)
(AnnotationMethodHandlerAdapter:1037) - Written [com.my.package.model.NameValue@166685b] as "application/json;charset=UTF-8" using [org.springframework.http.converter.json.MappingJacksonHttpMessageConverter@2059ef]
(DispatcherServlet:957) - Null ModelAndView returned to DispatcherServlet with name 'action-api': assuming HandlerAdapter completed request handling
(DispatcherServlet:913) - Successfully completed request
看起来像Spring进行了一些绑定,但是这次验证器被忽略了。我需要2个控制器,例如“ / api”和“ /
something”。我如何在web.xml中定义它,以便Spring能够找到它们并调用验证?
谢谢。
问题答案:
Spring @Controllers URL总是相对于处理它们的Spring Dispatcher
Servlet进行解释。因此,如果您将调度程序servlet映射到web.xml中的/ api / *,则指向上方控制器的URL为/ api / api /
choice
因此,您可以在web.xml中配置两个spring调度程序服务,其中一个映射到web.xml中的/ api,另一个映射到web.xml中的/
somethingelse,然后您就可以从@RequestMappings中删除/ api
在我的应用程序中,我将单个Dispatcher
Servlet用于api和UI,并且在各种API控制器中使用称为URL的公共静态最终String来建立指向该API公开的各种资源的路径。以下是来自我的API的示例。
@Controller
@RequestMapping(CompanyPermissionsResourceController.PATH)
public class CompanyPermissionsResourceController extends BaseApiController
{
public static final String PATH = CompanyResourceController.PATH + "/permissions";