前段时间自己试着搭了一个框架,在处理返回值的时候想用<mvc:return-value-handlers></mvc:return-value-handlers>标签去指定返回时的数据处理,但是运行程序时候不管我怎么弄,发现都不能进入自己定义的处理类中,下面是我的类
public class JsonReturnHandler implements HandlerMethodReturnValueHandler {
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return true;
}
@Override
public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest)
throws Exception {
mavContainer.setRequestHandled(true);
}
}
一个再简单不过的HandlerMethodReturnValueHandler 实现类,而springmvc配置文件中我配置了注册了这个处理类
<mvc:return-value-handlers>
<bean class="com.trunk.core.web.JsonReturnHandler"></bean>
</mvc:return-value-handlers>
启动程序之后跟代码发现我的处理类有加入到RequestMappingHandlerAdapter 类的返回值列表里面
public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter implements BeanFactoryAware, InitializingBean {
.....
private List<HandlerMethodReturnValueHandler> getDefaultReturnValueHandlers() {
List<HandlerMethodReturnValueHandler> handlers = new ArrayList();
handlers.add(new ModelAndViewMethodReturnValueHandler());
handlers.add(new ModelMethodProcessor());
handlers.add(new ViewMethodReturnValueHandler());
handlers.add(new ResponseBodyEmitterReturnValueHandler(this.getMessageConverters()));
handlers.add(new StreamingResponseBodyReturnValueHandler());
handlers.add(new HttpEntityMethodProcessor(this.getMessageConverters(), this.contentNegotiationManager, this.requestResponseBodyAdvice));
handlers.add(new HttpHeadersReturnValueHandler());
handlers.add(new CallableMethodReturnValueHandler());
handlers.add(new DeferredResultMethodReturnValueHandler());
handlers.add(new AsyncTaskMethodReturnValueHandler(this.beanFactory));
handlers.add(new ModelAttributeMethodProcessor(false));
handlers.add(new RequestResponseBodyMethodProcessor(this.getMessageConverters(), this.contentNegotiationManager, this.requestResponseBodyAdvice));
handlers.add(new ViewNameMethodReturnValueHandler());
handlers.add(new MapMethodProcessor());
if(this.getCustomReturnValueHandlers() != null) {
handlers.addAll(this.getCustomReturnValueHandlers());
}
if(!CollectionUtils.isEmpty(this.getModelAndViewResolvers())) {
handlers.add(new ModelAndViewResolverMethodReturnValueHandler(this.getModelAndViewResolvers()));
} else {
handlers.add(new ModelAttributeMethodProcessor(true));
}
return handlers;
}
.....
}
但是调用control的时候缺没有发现进入自定义处理类,后面看了一下,因为我的自定义处理类加在了默认处理类后面,默认处理类处理完之后直接返回,就没有进入自定义处理类。
看了网上很多答案说在springmvc配置文件中加入
<bean id="handler" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="customReturnValueHandlers">
<list>
<bean class="com.trunk.core.web.JsonReturnHandler"></bean>
</list>
</property>
</bean>
但是还是没有用.....后面发现了一个解决方案,在springmvc的配置文件中加入这个bean
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="returnValueHandlers" >
<list>
<bean class="com.trunk.core.web.JsonReturnHandler"/>
</list>
</property>
</bean>
所以指定的类成员变量应该是 returnValueHandlers 而不是 customReturnValueHandlers !!!
记录下这个坑,希望能帮到大家,如果有什么说的不对的,也希望各位指出,互相学习
END.