我最近升级到3.2版,并注意到AnnotationMethodHandlerAdapter
已被弃用,而不是RequestMappingHandlerAdapter
。所以我重新配置使用新类,完成我需要的自定义MessageConverter
。一切都很好。
但是,在尝试点击带注释的Controller
支持的网址时,我收到了错误消息:
[java] javax.servlet.ServletException: No adapter for handler [my.company.TagController@1c2e7808]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler
[java] at org.springframework.web.servlet.DispatcherServlet.getHandlerAdapter(DispatcherServlet.java:1128)
[java] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:903)
[java] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
调试调度程序时,特别是Dispatcher.getHandlerAdapter()
方法时,它找到了我的HandlerAdapter
,但调用的AbstractHandlerMethodAdapter.supports()
需要MethodHandler
:
public final boolean supports(Object handler) {
return handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler);
}
且控制器不是HandlerMethod
。 AnnotatedMethodHandlerAdapter
的支持方法是......好吧,不同(并且仍在使用!)
public boolean supports(Object handler) {
return getMethodResolver(handler).hasHandlerMethods();
}
所以我显然不能简单地升级到新类......我缺少一些额外的配置,但文档并没有真正帮助我。有什么想法吗?
感谢。
答案 0 :(得分:20)
使用&#34; <mvc:annotation-driven/>
&#34;在spring配置文件中,而不是编写自己的WebMvcConfigurationSupport实现
示例
<mvc:annotation-driven/>
<context:component-scan base-package="com.springapp.mvc"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.FormHttpMessageConverter"/>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
</list>
</property>
</bean>
答案 1 :(得分:8)
事实证明,由于RequestMappingHandlerAdapter取决于正在创建和配置的整个实体,因此简单地切换bean定义不起作用。默认情况下,Spring使用WebMvcConfigurationSupport实体来执行所有这些默认配置,但只是创建我自己的bean版本没有用,因为spring创建了自己的bean版本。
我的方法最终成为下面的内容,我基本上将所有配置保留到spring的默认值,但随后添加了我自己的转换器。唯一的缺点是它将xml配置切换到javaconfig,但在我的情况下,它没关系。有一篇文章here描述了类似的内容。
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
@Bean
public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
RequestMappingHandlerAdapter handlerAdapter = super.requestMappingHandlerAdapter();
handlerAdapter.getMessageConverters().add(0, getProtobufJsonMessageConverter());
return handlerAdapter;
}
答案 2 :(得分:1)
Form2 form = new Form2();
if(form.ShowDialog() == DialogResult.Yes){
//do some stuff
}
else {
//do some other stuff
}