SpringMVC 拦截返回值,并自定义

深碍√TFBOYSˉ_ 2022-08-07 21:00 272阅读 0赞

有关取代mvc:annotation-driven使用自定义配置请看:

http://blog.csdn.net/cml_blog/article/details/45222431

1、在项目开发中,自定义全局返回值拦截是非常实用的,就如在Struts2的拦截器中,可以根据Action的返回值自定义返回信息,如果返回SUCCESS就统一返回一个成功的json对象,如果FAIL就返回全局的定义信息

2、配置xml:

  1. <context:component-scan base-package="com.cml.mvc.*" />
  2. <!-- 取代mvc:annotation-driven> -->
  3. <bean
  4. class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
  5. </bean>
  6. <!-- 采用SpringMVC自带的JSON转换工具,支持@ResponseBody注解 -->
  7. <bean
  8. class=" org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
  9. <!-- 自定义返回值拦截 -->
  10. <property name="responseBodyAdvice">
  11. <list>
  12. <bean class="com.cml.mvc.base.MyResponseBodyAdvice"></bean>
  13. </list>
  14. </property>
  15. <!-- 自定义返回值校验 -->
  16. <property name="customReturnValueHandlers">
  17. <list>
  18. <bean class="com.cml.mvc.base.MyReturnValues"></bean>
  19. </list>
  20. </property>
  21. <!-- 注入全局的propertiesEditor -->
  22. <property name="webBindingInitializer">
  23. <bean class="com.cml.mvc.base.BaseWebBindingInital">
  24. <property name="timeFormatter" value="yyyy-MM-dd HH:mm:ss"></property>
  25. </bean>
  26. </property>
  27. <property name="contentNegotiationManager" ref="contentNegotiationManager"></property>
  28. </bean>
  29. <!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
  30. <bean id="mappingJacksonHttpMessageConverter"
  31. class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
  32. <property name="supportedMediaTypes">
  33. <list>
  34. <value>text/html;charset=UTF-8</value>
  35. </list>
  36. </property>
  37. </bean>
  38. <bean id="contentNegotiationManager"
  39. class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
  40. <property name="favorPathExtension" value="false" />
  41. <property name="favorParameter" value="true" />
  42. <property name="mediaTypes">
  43. <value>
  44. json=application/json
  45. xml=application/xml
  46. </value>
  47. </property>
  48. </bean>
  49. <!-- 取代mvc:annotation-driven> end -->

2、自定义返回值拦截类,只要实现 org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice接口即可

  1. package com.cml.mvc.base;
  2. import org.apache.commons.logging.Log;
  3. import org.apache.commons.logging.LogFactory;
  4. import org.springframework.core.MethodParameter;
  5. import org.springframework.http.MediaType;
  6. import org.springframework.http.converter.HttpMessageConverter;
  7. import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
  8. import org.springframework.http.server.ServerHttpRequest;
  9. import org.springframework.http.server.ServerHttpResponse;
  10. import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
  11. import com.cml.mvc.beans.Result;
  12. public class MyResponseBodyAdvice implements ResponseBodyAdvice<Result> {
  13. private static Log log = LogFactory.getLog(MyResponseBodyAdvice.class);
  14. @Override
  15. public boolean supports(MethodParameter returnType,
  16. Class<? extends HttpMessageConverter<?>> converterType) {
  17. log.debug("MyResponseBodyAdvice==>supports:" + converterType);
  18. log.debug("MyResponseBodyAdvice==>supports:" + returnType.getClass());
  19. log.debug("MyResponseBodyAdvice==>supports:"
  20. + MappingJackson2HttpMessageConverter.class
  21. .isAssignableFrom(converterType));
  22. return MappingJackson2HttpMessageConverter.class
  23. .isAssignableFrom(converterType);
  24. }
  25. @Override
  26. public Result beforeBodyWrite(Result body, MethodParameter returnType,
  27. MediaType selectedContentType,
  28. Class<? extends HttpMessageConverter<?>> selectedConverterType,
  29. ServerHttpRequest request, ServerHttpResponse response) {
  30. log.debug("MyResponseBodyAdvice==>beforeBodyWrite:" + returnType + ","
  31. + body);
  32. body.setB("我是后面设置的");
  33. return body;
  34. }
  35. }

3、controller中只要返回自定义的Result对象,就可以拦截到转换信息,controller代码

  1. @RequestMapping("/times")
  2. @ResponseBody
  3. public Result getTime( Integer id) {
  4. log.debug("==========>getTime,id:" + id);
  5. Result result=new Result();
  6. result.setA(1);
  7. return result;
  8. }

action中设置了A的值为1,在页面上返回结果:

Center
成功实现自定义返回信息。

发表评论

表情:
评论列表 (有 0 条评论,272人围观)

还没有评论,来说两句吧...

相关阅读

    相关 springMvc定义拦截

    其实最初我是不想这篇文章的,因为我个人感觉拦截器没什么用,如果是需要权限拦截的话,完成可以使用现成的权限框架,比如shiro,不是因为我懒,因为我们自己去写的话肯定会有一堆问题