spring mvc aop配置事务的相关配置

spring mvc aop配置事务的相关配置

标签: spring mvc事务aop
1226人阅读 评论(0) 收藏 举报
分类:

一共四个配置文件包括web.xml

spring-hibernate.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"  
  5.     xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  7.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  8.            http://www.springframework.org/schema/context  
  9.            http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  10.            http://www.springframework.org/schema/tx   
  11.            http://www.springframework.org/schema/tx/spring-tx-2.5.xsd  
  12.            http://www.springframework.org/schema/aop   
  13.            http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  14.              http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring  
  15.        http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd  
  16.            ">  
  17.   
  18.     <!-- JNDI方式配置数据源 -->  
  19.     <!-- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">   
  20.         <property name="jndiName" value="${jndiName}"></property> </bean> -->  
  21.   
  22.       
  23.  <!-- <bean id="sacheService" class="com.base.service.impl.ProductInfoServiceImpl"></bean> -->  
  24.     <!-- 配置数据源 -->  
  25.     <bean id="dataSource" name="dataSource" class="com.alibaba.druid.pool.DruidDataSource"  
  26.         init-method="init" destroy-method="close">  
  27.         <property name="url" value="${jdbc_url}" />  
  28.         <property name="username" value="${jdbc_username}" />  
  29.         <property name="password" value="${jdbc_password}" />  
  30.   
  31.         <!-- 初始化连接大小 -->  
  32.         <property name="initialSize" value="0" />  
  33.         <!-- 连接池最大使用连接数量 -->  
  34.         <property name="maxActive" value="20" />  
  35.         <!-- 连接池最大空闲 -->  
  36.         <property name="maxIdle" value="20" />  
  37.         <!-- 连接池最小空闲 -->  
  38.         <property name="minIdle" value="0" />  
  39.         <!-- 获取连接最大等待时间 -->  
  40.         <property name="maxWait" value="60000" />  
  41.   
  42.         <!-- <property name="poolPreparedStatements" value="true" /> <property   
  43.             name="maxPoolPreparedStatementPerConnectionSize" value="33" /> -->  
  44.   
  45.         <property name="validationQuery" value="${validationQuery}" />  
  46.         <property name="testOnBorrow" value="false" />  
  47.         <property name="testOnReturn" value="false" />  
  48.         <property name="testWhileIdle" value="true" />  
  49.   
  50.         <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->  
  51.         <property name="timeBetweenEvictionRunsMillis" value="60000" />  
  52.         <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->  
  53.         <property name="minEvictableIdleTimeMillis" value="25200000" />  
  54.   
  55.         <!-- 打开removeAbandoned功能 -->  
  56.         <property name="removeAbandoned" value="true" />  
  57.         <!-- 1800秒,也就是30分钟 -->  
  58.         <property name="removeAbandonedTimeout" value="1800" />  
  59.         <!-- 关闭abanded连接时输出错误日志 -->  
  60.         <property name="logAbandoned" value="true" />  
  61.   
  62.         <!-- 监控数据库 -->  
  63.         <!-- <property name="filters" value="stat" /> -->  
  64.         <property name="filters" value="mergeStat" />  
  65.     </bean>  
  66.   
  67.     <!-- 配置hibernate session工厂 -->  
  68.     <bean id="sessionFactory"  
  69.         class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  
  70.         <property name="dataSource" ref="dataSource" />  
  71.         <property name="hibernateProperties">  
  72.             <props>  
  73.                 <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>  
  74.                 <prop key="hibernate.dialect">com.dialect.MysqlDialect</prop>  
  75.                 <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>  
  76.                 <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>  
  77.             </props>  
  78.         </property>  
  79.   
  80.         <!-- 自动扫描注解方式配置的hibernate类文件 -->  
  81.         <property name="packagesToScan">  
  82.             <list>  
  83.                 <value>com.model</value>  
  84.             </list>  
  85.         </property>  
  86.   
  87.           
  88.     </bean>  
  89.   
  90.     <!-- 配置事务管理器 -->  
  91.     <bean name="transactionManager" id="transactionManager"  
  92.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  93.         <property name="sessionFactory" ref="sessionFactory"></property>  
  94.     </bean>  
  95.       
  96.      <bean id="persistenceExceptionTranslationPostProcessor"   
  97.        class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />  
  98.          
  99.     <!-- 注解方式配置事物 -->  
  100.     <!-- <tx:annotation-driven transaction-manager="transactionManager" /> -->  
  101.     <context:annotation-config/>  
  102.       
  103.   
  104.       
  105.     <!-- 拦截器方式配置事物 -->  
  106.     <!-- <tx:advice id="transactionAdvice" transaction-manager="transactionManager">  
  107.         <tx:attributes>  
  108.             <tx:method name="add*" rollback-for="java.lang.Exception"/>  
  109.             <tx:method name="save*" rollback-for="java.lang.Exception"/>  
  110.             <tx:method name="update*" rollback-for="java.lang.Exception"/>  
  111.             <tx:method name="modify*" rollback-for="java.lang.Exception"/>  
  112.             <tx:method name="edit*" rollback-for="java.lang.Exception"/>  
  113.             <tx:method name="delete*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>  
  114.             <tx:method name="remove*" rollback-for="java.lang.Exception"/>  
  115.             <tx:method name="repair" rollback-for="java.lang.Exception"/>  
  116.             <tx:method name="deleteAndRepair" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>  
  117.             <tx:method name="check*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>  
  118.             <tx:method name="count*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>  
  119.   
  120.             <tx:method name="get*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>  
  121.             <tx:method name="find*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>  
  122.             <tx:method name="load*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>  
  123.             <tx:method name="search*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>  
  124.             <tx:method name="datagrid*" propagation="SUPPORTS" rollback-for="java.lang.Exception"/>  
  125.   
  126.             <tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>  
  127.         </tx:attributes>  
  128.     </tx:advice> -->  
  129.     <bean id="aspectBean" class="com.aop.AopLog"></bean>     
  130.    <aop:config>    
  131.         <aop:aspect id="AopLog" ref="aspectBean">    
  132.             <!--配置com.spring.service包下所有类或接口的所有方法-->    
  133.             <aop:pointcut id="businessService"    
  134.                 expression="execution(* com.controller..*.*(..)) || execution(* com.base.service.impl.*.*(..))" />    
  135.             <aop:before pointcut-ref="businessService" method="doBefore"/>    
  136.             <aop:after pointcut-ref="businessService" method="doAfter"/>    
  137.             <aop:around pointcut-ref="businessService" method="doAround"/>    
  138.             <aop:after-throwing pointcut-ref="businessService" method="doThrowing" throwing="ex"/>    
  139.         </aop:aspect>    
  140.     </aop:config>   
  141.      
  142.     <!-- hiebernate中的hibernateTemplate模板方法 -->  
  143.     <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">  
  144.         <!-- 给HibernateTemplate类中注入 sessionFactory获得实例 -->  
  145.         <property name="sessionFactory" ref="sessionFactory"></property>  
  146.           
  147.     </bean>  
  148.       
  149.     <!-- 使用annotation 自动注册bean,并检查@Required,@Autowired的属性已被注入 -->  
  150.     <!-- <context:component-scan base-package="com.base.dao,com.base.service,com.aop" /> -->  
  151.   
  152. </beans>  
spring.xml
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xmlns:context="http://www.springframework.org/schema/context"  
  5.        xmlns:tx="http://www.springframework.org/schema/tx"  
  6.        xmlns:aop="http://www.springframework.org/schema/aop"  
  7.        xsi:schemaLocation="http://www.springframework.org/schema/beans  
  8.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  9.            http://www.springframework.org/schema/context  
  10.            http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  11.            http://www.springframework.org/schema/tx   
  12.            http://www.springframework.org/schema/tx/spring-tx-2.5.xsd  
  13.            http://www.springframework.org/schema/aop   
  14.            http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">  
  15.   
  16.     <!-- 引入属性文件 -->  
  17.     <context:property-placeholder location="classpath:config.properties" />  
  18.       
  19.     <tx:annotation-driven transaction-manager="transactionManager"/>  
  20.   
  21.     <!-- 自动扫描dao和service包(自动注入) -->  
  22.     <context:component-scan base-package="com.base.dao,com.base.service,com.aop" />  
  23.     <!-- <bean class="zy.utils.DeleteTimer"></bean> -->  
  24. </beans>  

spring3mvc-servlet.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"  
  6.     xmlns:tx="http://www.springframework.org/schema/tx"  
  7.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  8.        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd     
  9.        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd     
  10.        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd     
  11.        http://www.springframework.org/schema/context   
  12.        http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  13.        http://www.springframework.org/schema/aop  
  14.        http://www.springframework.org/schema/aop/spring-aop.xsd  
  15.        http://www.springframework.org/schema/mvc   
  16.        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
  17.        http://www.springframework.org/schema/tx   
  18.        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd   
  19.        ">  
  20.   
  21.     <context:annotation-config />  
  22.   
  23.     <context:component-scan base-package="com.controller"></context:component-scan>  
  24.     <!-- enable the configuration of transactional behavior based on annotations -->  
  25.   
  26.     <!-- a PlatformTransactionManager is still required -->  
  27.   
  28.   
  29.     <!-- 设置multipartResolver才能完成文件上传 -->  
  30.     <bean id="multipartResolver"  
  31.         class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
  32.         <property name="maxUploadSize" value="5000000000"></property>  
  33.         <property name="defaultEncoding" value="UTF-8" />  
  34.     </bean>  
  35.     <bean  
  36.         class="org.springframework.web.servlet.view.InternalResourceViewResolver"  
  37.         p:prefix="/jsp/" p:suffix=".jsp" />  
  38.     <bean id="aspectBean" class="com.aop.AopLog"></bean>  
  39.     <aop:aspectj-autoproxy proxy-target-class="true" />  
  40.     <bean  
  41.         class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
  42.         <property name="messageConverters">  
  43.             <list>  
  44.                 <bean class="com.jsonconvert.EageJacksonConverter" />  
  45.             </list>  
  46.         </property>  
  47.     </bean>  
  48.   
  49.   
  50.     <!-- SpringMVC在超出上传文件限制时,会抛出org.springframework.web.multipart.MaxUploadSizeExceededException -->  
  51.     <!-- 该异常是SpringMVC在检查上传的文件信息时抛出来的,而且此时还没有进入到Controller方法中 -->  
  52.     <bean id="exceptionResolver"  
  53.         class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
  54.         <property name="exceptionMappings">  
  55.             <props>  
  56.                 <!-- 遇到MaxUploadSizeExceededException异常时,自动跳转到/WEB-INF/jsp/error_fileupload.jsp页面 -->  
  57.                 <prop  
  58.                     key="org.springframework.web.multipart.MaxUploadSizeExceededException">404</prop>  
  59.             </props>  
  60.         </property>  
  61.     </bean>  
  62.     <!-- <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/*admin*"/>   
  63.         <bean id="loginInterceptor" class="com.Sys.UserInterceptor"/> </mvc:interceptor>   
  64.         <mvc:interceptor> <mvc:mapping path="/app/**"/> <bean id="appInterceptor"   
  65.         class="com.Sys.AppInterceptor"/> </mvc:interceptor> <mvc:interceptor> <mvc:mapping   
  66.         path="/supapp/*"/> <bean id="supappInterceptor" class="com.Sys.SupAppInterceptor"/>   
  67.         </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/forum*/**"/> <bean   
  68.         id="forumInterceptor" class="com.Sys.ForumInterceptor"/> </mvc:interceptor>   
  69.         <mvc:interceptor> <mvc:mapping path="/b2c/**"/> <bean id="b2cInterceptor"   
  70.         class="com.Sys.B2CInterceptor"/> </mvc:interceptor> </mvc:interceptors> -->  
  71. </beans>  

web.xml
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  
  3.   <display-name>LANTIN</display-name>  
  4.   <context-param>  
  5.     <param-name>contextConfigLocation</param-name>  
  6.     <param-value>  
  7. <span style="white-space:pre">            </span>classpath:spring/spring.xml,classpath:hibernate/spring-hibernate.xml  
  8. <span style="white-space:pre">        </span></param-value>  
  9.   </context-param>  
  10.   <servlet>  
  11.     <servlet-name>spring3mvc</servlet-name>  
  12.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  13.     <load-on-startup>1</load-on-startup>  
  14.   </servlet>  
  15.   <servlet-mapping>  
  16.     <servlet-name>spring3mvc</servlet-name>  
  17.     <url-pattern>*.html</url-pattern>  
  18.   </servlet-mapping>  
  19.   <error-page>  
  20.     <error-code>404</error-code>  
  21.     <location>/error.html</location>  
  22.   </error-page>  
  23.   <error-page>  
  24.     <error-code>500</error-code>  
  25.     <location>/error.html</location>  
  26.   </error-page>  
  27.   <error-page>  
  28.     <error-code>401</error-code>  
  29.     <location>/error.html</location>  
  30.   </error-page>  
  31.   <error-page>  
  32.     <error-code>403</error-code>  
  33.     <location>/error.html</location>  
  34.   </error-page>  
  35.   <listener>  
  36.     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  37.   </listener>  
  38. <!--   <listener>  
  39. <span style="white-space:pre">    </span>    <listener-class>com.listener.SessionListener</listener-class>  
  40. <span style="white-space:pre">    </span></listener>  
  41.  -->  <filter>  
  42.     <filter-name>CharacterEncodingFilter</filter-name>  
  43.     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
  44.     <init-param>  
  45.       <param-name>encoding</param-name>  
  46.       <param-value>utf-8</param-value>  
  47.     </init-param>  
  48.   </filter>  
  49.   <filter-mapping>  
  50.     <filter-name>CharacterEncodingFilter</filter-name>  
  51.     <url-pattern>/*</url-pattern>  
  52.   </filter-mapping>  
  53.     
  54.   <filter>  
  55. <filter-name>hibernateFilter</filter-name>  
  56. <filter-class>  
  57. org.springframework.orm.hibernate3.support.OpenSessionInViewFilter  
  58. </filter-class>  
  59. <init-param>  
  60.     <param-name>sessionFactoryBeanName</param-name>  
  61.     <param-value>sessionFactory</param-value>  
  62.    </init-param>  
  63.    <init-param>  
  64.             <param-name>singleSession</param-name>  
  65.             <param-value>true</param-value>             
  66.         </init-param>  
  67.         <init-param>  
  68.         <param-name> flushMode </param-name>  
  69.    <param-value>AUTO </param-value>          
  70.         </init-param>  
  71. </filter>  
  72.   
  73.   
  74. <filter-mapping>  
  75. <filter-name>hibernateFilter</filter-name>  
  76. <url-pattern>/*</url-pattern>  
  77. </filter-mapping>  
  78.   <welcome-file-list>  
  79.     <welcome-file>login/login.html</welcome-file>  
  80.   </welcome-file-list>  
  81.   <session-config>  
  82.   <span style="white-space:pre"> </span><session-timeout>0</session-timeout>  
  83.   </session-config>  
  84. </web-app>  

AopLog.java
  1. package com.aop;  
  2.   
  3. import org.apache.log4j.Logger;  
  4. import org.aspectj.lang.JoinPoint;  
  5. import org.aspectj.lang.ProceedingJoinPoint;  
  6. import org.aspectj.lang.annotation.Aspect;  
  7. import org.springframework.stereotype.Component;  
  8.   
  9.   
  10. @Aspect  
  11. @Component  
  12. public class AopLog {  
  13.       
  14.     private static final Logger logger=Logger.getLogger(AopLog.class);  
  15.       
  16.     //@After("execution(* com.controller.*.*(..))")  
  17.      public void doAfter(JoinPoint jp) {    
  18. //          System.out.println("log Ending method: "    
  19. //                  + jp.getTarget().getClass().getName() + "."    
  20. //                  + jp.getSignature().getName());  
  21.             logger.info("log Ending method: "    
  22.                     + jp.getTarget().getClass().getName() + "."    
  23.                     + jp.getSignature().getName());  
  24.            /* LoggerUtil.info(jp.getClass(),jp.getTarget().getClass().getName() + "."   
  25.                     + jp.getSignature().getName()+"[logo]:normal");*/  
  26.              
  27.         }    
  28.     //@Around("execution(* com.controller.*.*(..))")  
  29.         public Object doAround(ProceedingJoinPoint pjp) throws Throwable {    
  30.             long time = System.currentTimeMillis();    
  31.             Object retVal = pjp.proceed();    
  32.             time = System.currentTimeMillis() - time;    
  33. //          System.out.println("process time: " + time + " ms");    
  34.             logger.info("process time: " + time + " ms");  
  35.             return retVal;    
  36.         }    
  37.     //@Before("execution(* com.controller.*.*(..))")  
  38.         public void doBefore(JoinPoint jp) throws Exception {  
  39.               
  40.               
  41.              logger.info("log Begining method: "    
  42.                     + jp.getTarget().getClass().getName() + "."    
  43.                     + jp.getSignature().getName());  
  44. //          System.out.println("log Begining method: "    
  45. //                  + jp.getTarget().getClass().getName() + "."    
  46. //                  + jp.getSignature().getName());    
  47.         }    
  48.     //@AfterThrowing("execution(* com.controller.*.*(..))")  
  49.         public void doThrowing(JoinPoint jp, Throwable ex) {    
  50. //          System.out.println("method " + jp.getTarget().getClass().getName()    
  51. //                  + "." + jp.getSignature().getName() + " throw exception");  
  52.             logger.info("method " + jp.getTarget().getClass().getName()    
  53.                     + "." + jp.getSignature().getName() + " throw exception");  
  54. //          System.out.println(ex.getMessage());    
  55.             logger.info(ex.getMessage());  
  56.             /*LoggerUtil.info(jp.getClass(),jp.getTarget().getClass().getName() + "."   
  57.                     + jp.getSignature().getName()+"[logo]:exception"+ex.toString());*/  
  58.         }    
  59.           
  60.        /* private void sendEx(JoinPoint jp,String ex) {   
  61.             LoggerUtil.info(jp.getClass(),jp.getTarget().getClass().getName() + "."   
  62.                     + jp.getSignature().getName()+"[logo]:exception"+ex); 
  63.         }  */  
  64. }  

EageJacksonConverter.Java

  1. package com.jsonconvert;  
  2.   
  3. import java.io.IOException;  
  4. import java.nio.charset.Charset;  
  5.   
  6. import org.codehaus.jackson.JsonEncoding;  
  7. import org.codehaus.jackson.JsonGenerationException;  
  8. import org.codehaus.jackson.JsonGenerator;  
  9. import org.codehaus.jackson.JsonParseException;  
  10. import org.codehaus.jackson.JsonProcessingException;  
  11. import org.codehaus.jackson.map.JsonSerializer;  
  12. import org.codehaus.jackson.map.ObjectMapper;  
  13. import org.codehaus.jackson.map.SerializerProvider;  
  14. import org.codehaus.jackson.map.type.TypeFactory;  
  15. import org.codehaus.jackson.type.JavaType;  
  16. import org.springframework.http.HttpInputMessage;  
  17. import org.springframework.http.HttpOutputMessage;  
  18. import org.springframework.http.MediaType;  
  19. import org.springframework.http.converter.AbstractHttpMessageConverter;  
  20. import org.springframework.http.converter.HttpMessageNotReadableException;  
  21. import org.springframework.http.converter.HttpMessageNotWritableException;  
  22. import org.springframework.util.Assert;  
  23.   
  24. public class EageJacksonConverter extends AbstractHttpMessageConverter<Object> {  
  25.     public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");  
  26.   
  27.     private ObjectMapper objectMapper = new ObjectMapper();  
  28.   
  29.     private boolean prefixJson = false;  
  30.   
  31.     public EageJacksonConverter() {  
  32.         super(new MediaType("application""json", DEFAULT_CHARSET));  
  33.     }  
  34.   
  35.     public void setObjectMapper(ObjectMapper objectMapper) {  
  36.         Assert.notNull(objectMapper, "'objectMapper' must not be null");  
  37.         this.objectMapper = objectMapper;  
  38.     }  
  39.   
  40.     public void setPrefixJson(boolean prefixJson) {  
  41.         this.prefixJson = prefixJson;  
  42.     }  
  43.   
  44.     public boolean canRead(Class<?> clazz, MediaType mediaType) {  
  45.         JavaType javaType = getJavaType(clazz);  
  46.         return (this.objectMapper.canDeserialize(javaType))  
  47.                 && (canRead(mediaType));  
  48.     }  
  49.   
  50.     protected JavaType getJavaType(Class<?> clazz) {  
  51.         return TypeFactory.type(clazz);  
  52.     }  
  53.   
  54.     public boolean canWrite(Class<?> clazz, MediaType mediaType) {  
  55.         return (this.objectMapper.canSerialize(clazz)) && (canWrite(mediaType));  
  56.     }  
  57.   
  58.     protected boolean supports(Class<?> clazz) {  
  59.         throw new UnsupportedOperationException();  
  60.     }  
  61.   
  62.     protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage)  
  63.             throws IOException, HttpMessageNotReadableException {  
  64.         JavaType javaType = getJavaType(clazz);  
  65.         try {  
  66.             return this.objectMapper  
  67.                     .readValue(inputMessage.getBody(), javaType);  
  68.         } catch (JsonParseException ex) {  
  69.             throw new HttpMessageNotReadableException("Could not read JSON: "  
  70.                     + ex.getMessage(), ex);  
  71.         }  
  72.     }  
  73.   
  74.     protected void writeInternal(Object o, HttpOutputMessage outputMessage)  
  75.             throws IOException, HttpMessageNotWritableException {  
  76.   
  77.         JsonEncoding encoding = getEncoding(outputMessage.getHeaders()  
  78.                 .getContentType());  
  79.         SerializerProvider serializerProvider = this.objectMapper  
  80.                 .getSerializerProvider();  
  81.         serializerProvider.setNullValueSerializer(new JsonSerializer<Object>() {  
  82.   
  83.             @Override  
  84.             public void serialize(Object arg0, JsonGenerator arg1,  
  85.                     SerializerProvider arg2) throws IOException,  
  86.                     JsonProcessingException {  
  87.                 arg1.writeObject("");  
  88.             }  
  89.   
  90.         });  
  91.   
  92.         JsonGenerator jsonGenerator = this.objectMapper.getJsonFactory()  
  93.                 .createJsonGenerator(outputMessage.getBody(), encoding);  
  94.         try {  
  95.             if (this.prefixJson) {  
  96.                 jsonGenerator.writeRaw("{} && ");  
  97.             }  
  98.             this.objectMapper.writeValue(jsonGenerator, o);  
  99.         } catch (JsonGenerationException ex) {  
  100.             throw new HttpMessageNotWritableException("Could not write JSON: "  
  101.                     + ex.getMessage(), ex);  
  102.         }  
  103.     }  
  104.   
  105.     private JsonEncoding getEncoding(MediaType contentType) {  
  106.         if ((contentType != null) && (contentType.getCharSet() != null)) {  
  107.             Charset charset = contentType.getCharSet();  
  108.             for (JsonEncoding encoding : JsonEncoding.values()) {  
  109.                 if (charset.name().equals(encoding.getJavaName())) {  
  110.                     return encoding;  
  111.                 }  
  112.             }  
  113.         }  
  114.         return JsonEncoding.UTF8;  
  115.     }  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值