Maven构建Spring+MyBatis+JTA(atomikos)框架

maven构建项目,详见笔记“maven构建多模块工程”

开发工具:IntelliJ IDEA

JDK版本:1.8

Maven版本:3.3.9

项目结构:

87194969-f076-412c-ad35-ab85e2a61392

SpringMybatisJtaModel/src/main/resources/mapper存放mybatis生成的mapper.xml文件

 

jdbc.properties文件内容

#jdbc_driverClassName=com.mysql.cj.jdbc.Driver
#jdbc_driverClassName=com.mysql.jdbc.Driver
#jdbc_url=jdbc:mysql://chaomeiman.peterren.net:3306/catering?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
#jdbc_username=root
#jdbc_password=P@ssw0rd
#-------------user-----------------#
userjdbc_driverClassName=com.mysql.cj.jdbc.MysqlXADataSource
userjdbc_url=jdbc:mysql://192.168.1.10:3308/yxs_user_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&pinGlobalTxToPhysicalConnection=true&nullNamePatternMatchesAll=true
userjdbc_username=root
#userjdbc_password=P@ssw0rd
userjdbc_password=walletroot
#-------------主数据源-------------#
jdbc_driverClassName=com.mysql.cj.jdbc.MysqlXADataSource
jdbc_url=jdbc:mysql://192.168.1.10:3308/yxs_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&pinGlobalTxToPhysicalConnection=true&nullNamePatternMatchesAll=true
jdbc_username=root
#jdbc_password=P@ssw0rd
jdbc_password=walletroot
#-------------log-------------#
logjdbc_driverClassName=com.mysql.jdbc.Driver
logjdbc_url=jdbc:mysql://192.168.1.10:3308/yxs_log_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&pinGlobalTxToPhysicalConnection=true&nullNamePatternMatchesAll=true
logjdbc_username=root
#logjdbc_password=P@ssw0rd
logjdbc_password=walletroot
#-------------report-------------#
reportjdbc_driverClassName=com.mysql.jdbc.Driver
reportjdbc_url=jdbc:mysql://192.168.1.10:3308/yxs_report_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&pinGlobalTxToPhysicalConnection=true&nullNamePatternMatchesAll=true
reportjdbc_username=root
#reportjdbc_password=P@ssw0rd
reportjdbc_password=walletroot

#    菜单数据库
meal_dataSourceClassName=com.mysql.cj.jdbc.MysqlXADataSource
mealjdbc_driverClassName=com.mysql.cj.jdbc.Driver
mealjdbc_url=jdbc:mysql://192.168.1.10:3308/yxs_meal_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&pinGlobalTxToPhysicalConnection=true&nullNamePatternMatchesAll=true
mealjdbc_username=root
mealjdbc_password=walletroot


jdbc_properties=file:\\\\D:\\ideaWork\\Catering\\src\\main\resources\\conf\\jdbc.properties
UseSSL=true
RequireSSL=true
VerifyServerCertificate=true
Logger="com.mysql.jdbc.log.StandardLogger"
ClientCertificateKeyStoreType="JKS"
ClientCertificateKeyStoreUrl=KEYSTORE_PATH
ClientCertificateKeyStorePassword=KEYSTORE_PASSWORD
TrustCertificateKeyStoreType="JKS"
TrustCertificateKeyStoreUrl=TRUSTORE_PATH
TrustCertificateKeyStorePassword=TRUSTORE_PASSWORD

 

  1、pom文件添加springMVC、jta、mybatis等需要的jar

<dependencies>
    <!-- junit测试包 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>
    <!-- spring核心包 -->
    <!-- springframe start -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-oxm</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
    </dependency>

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
    </dependency>
    <!-- springframe end -->

    <!--jta包-->
    <dependency>
        <groupId>javax.transaction</groupId>
        <artifactId>jta</artifactId>
        <version>1.1</version>
    </dependency>

    <!--atomikos包-->
    <!--atomikos start-->
    <dependency>
        <groupId>com.atomikos</groupId>
        <artifactId>atomikos-util</artifactId>
        <version>${atomikos.version}</version>
    </dependency>
    <dependency>
        <groupId>com.atomikos</groupId>
        <artifactId>transactions</artifactId>
        <version>${atomikos.version}</version>
    </dependency>
    <dependency>
        <groupId>com.atomikos</groupId>
        <artifactId>transactions-jta</artifactId>
        <version>${atomikos.version}</version>
    </dependency>
    <dependency>
        <groupId>com.atomikos</groupId>
        <artifactId>transactions-jdbc</artifactId>
        <version>${atomikos.version}</version>
    </dependency>
    <dependency>
        <groupId>com.atomikos</groupId>
        <artifactId>transactions-api</artifactId>
        <version>${atomikos.version}</version>
    </dependency>
    <!--atomikos end-->

    <!-- mybatis核心包 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>${mybatis.version}</version>
    </dependency>

    <!-- mybatis/spring包 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>${mybatis-spring.version}</version>
    </dependency>

    <!-- mysql驱动包 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.connector.version}</version>
    </dependency>

    <!--http-->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
    </dependency>

    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.10</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <scope>provided</scope>
        <version>3.0.1</version>
    </dependency>

    <!-- 日志文件管理包 -->
    <!-- log start -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </dependency>
    <!-- log end -->
</dependencies>

2、创建applicationContext.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.3.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-4.3.xsd" default-autowire="byName">

    <!-- 1.扫描注解-->
    <context:component-scan base-package="controller"></context:component-scan>
    <context:component-scan base-package="mapper.*"></context:component-scan>
    <context:component-scan base-package="model.*"></context:component-scan>
    <context:component-scan base-package="service.impl"></context:component-scan>
    <!--2.注解驱动-->
    <mvc:annotation-driven></mvc:annotation-driven>

</beans>

3、创建mybatis-config.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <settings>
        <!-- Globally enables or disables any caches configured in any mapper under this configuration -->
        <setting name="cacheEnabled" value="true"/>
        <!-- Sets the number of seconds the driver will wait for a response from the database -->
        <setting name="defaultStatementTimeout" value="3000"/>
        <!-- Enables automatic mapping from classic database column names A_COLUMN to camel case classic Java property names aColumn -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!-- Allows JDBC support for generated keys. A compatible driver is required.
        This setting forces generated keys to be used if set to true,
         as some drivers deny compatibility but still work -->
        <setting name="useGeneratedKeys" value="true"/>
        <!--解决,查询返回结果含null,没有对应字段值问题-->
        <setting name="callSettersOnNulls" value="true"/>
    </settings>

    <!-- Continue going here -->
    <typeAliases>
        <package name="model.user.*"/>
    </typeAliases>
</configuration>

4、创建spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:p="http://www.springframework.org/schema/p"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">

    <!-- 对模型视图添加前后缀 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>

    <bean id="jacksonMessageChangerString"
          class="org.springframework.http.converter.StringHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/plain;charset=UTF-8</value>
            </list>
        </property>
    </bean>
    <bean id="jacksonMessageChanger"
          class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
                <value>text/plain;charset=UTF-8</value>
                <value>text/json;charset=UTF-8</value>
                <value>application/json;charset=UTF-8</value>
            </list>
        </property>
    </bean>
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jacksonMessageChanger"/>
                <ref bean="jacksonMessageChangerString"/>
            </list>
        </property>
    </bean>
</beans>

5、创建spring-mybatis.xml



<?xml version="1.0" encoding="GBK"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
    http://www.springframework.org/schema/util
    http://www.springframework.org/schema/util/spring-util-4.3.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

    <!-- 引入jdbc配置文件 -->
    <bean
            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
        <property name="ignoreResourceNotFound" value="true"/>
        <property name="locations">
            <list>
                <!-- standard config -->
                <value>classpath:conf/jdbc.properties</value>
            </list>
        </property>
    </bean>
    <!-- 配置数据源 -->
    <!-- 主数据库 -->
    <!--<bean id="dataSourceMain" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init"
          destroy-method="close">
        &lt;!&ndash;value只要两个数据源不同就行,随便取名&ndash;&gt;
        <property name="uniqueResourceName" value="mysql/sitestMain"/>
        <property name="xaDataSourceClassName" value="com.mysql.cj.jdbc.MysqlXADataSource"/>
        <property name="xaProperties">
            <props>
                &lt;!&ndash;<prop key="driverClassName">${jdbc.driverClassName1}</prop>&ndash;&gt;
                <prop key="url">${jdbc_url}</prop>
                <prop key="user">${jdbc_username}</prop>
                <prop key="password">${jdbc_password}</prop>
            </props>
        </property>
        &lt;!&ndash;<property name="pinGlobalTxToPhysicalConnection"  value="true"/>&ndash;&gt;
        <property name="maxLifetime" value="0"/>
        <property name="minPoolSize" value="1"/>
        <property name="maxPoolSize" value="10"/>
        <property name="poolSize" value="1"/>

    </bean>-->

    <!-- 用户数据库 -->
    <bean id="dataSourceUser" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init"
          destroy-method="close">
        <!-- value只要两个数据源不同就行,随便取名 -->
        <property name="uniqueResourceName" value="mysql/sitestUser"/>
        <property name="xaDataSourceClassName" value="com.mysql.cj.jdbc.MysqlXADataSource"/>
        <property name="xaProperties">
            <props>
                <!--<prop key="driverClassName">${userjdbc_driverClassName}</prop>-->
                <prop key="url">${userjdbc_url}</prop>
                <prop key="user">${userjdbc_username}</prop>
                <prop key="password">${userjdbc_password}</prop>
            </props>
        </property>
        <!--<property name="pinGlobalTxToPhysicalConnection"  value="true"/>-->
        <property name="maxLifetime" value="0"/>
        <property name="minPoolSize" value="1"/>
        <property name="maxPoolSize" value="10"/>
        <property name="poolSize" value="1"/>

    </bean>

    <!-- log数据库 -->
    <!--<bean id="dataSourceLog" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init"
          destroy-method="close">
        &lt;!&ndash; value只要两个数据源不同就行,随便取名 &ndash;&gt;
        <property name="uniqueResourceName" value="mysql/sitestLog"/>
        <property name="xaDataSourceClassName" value="com.mysql.cj.jdbc.MysqlXADataSource"/>
        <property name="xaProperties">
            <props>
                &lt;!&ndash;<prop key="driverClassName">${logjdbc_driverClassName}</prop>&ndash;&gt;
                <prop key="url">${logjdbc_url}</prop>
                <prop key="user">${logjdbc_username}</prop>
                <prop key="password">${logjdbc_password}</prop>
            </props>
        </property>
        &lt;!&ndash;<property name="pinGlobalTxToPhysicalConnection"  value="true"/>&ndash;&gt;
        <property name="maxLifetime" value="0"/>
        <property name="minPoolSize" value="1"/>
        <property name="maxPoolSize" value="10"/>
        <property name="poolSize" value="1"/>

    </bean>-->

    <!-- report数据库 -->
    <!--<bean id="dataSourceReport" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init"
          destroy-method="close">
        &lt;!&ndash; value只要两个数据源不同就行,随便取名 &ndash;&gt;
        <property name="uniqueResourceName" value="mysql/sitestReport"/>
        <property name="xaDataSourceClassName" value="com.mysql.cj.jdbc.MysqlXADataSource"/>
        <property name="xaProperties">
            <props>
                &lt;!&ndash;<prop key="driverClassName">${logjdbc_driverClassName}</prop>&ndash;&gt;
                <prop key="url">${reportjdbc_url}</prop>
                <prop key="user">${reportjdbc_username}</prop>
                <prop key="password">${reportjdbc_password}</prop>
            </props>
        </property>
        &lt;!&ndash;<property name="pinGlobalTxToPhysicalConnection"  value="true"/>&ndash;&gt;
        <property name="maxLifetime" value="0"/>
        <property name="minPoolSize" value="1"/>
        <property name="maxPoolSize" value="10"/>
        <property name="poolSize" value="1"/>

    </bean>-->
    <!-- meal数据库 -->
    <!--<bean id="dataSourceMeal" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init"
          destroy-method="close">
        &lt;!&ndash; value只要两个数据源不同就行,随便取名 &ndash;&gt;
        <property name="uniqueResourceName" value="mysql/sitestMeal"/>
        <property name="xaDataSourceClassName" value="com.mysql.cj.jdbc.MysqlXADataSource"/>
        <property name="xaProperties">
            <props>
                &lt;!&ndash;<prop key="driverClassName">${mealjdbc_driverClassName}</prop>&ndash;&gt;
                <prop key="url">${mealjdbc_url}</prop>
                <prop key="user">${mealjdbc_username}</prop>
                <prop key="password">${mealjdbc_password}</prop>
            </props>
        </property>
        &lt;!&ndash;<property name="pinGlobalTxToPhysicalConnection"  value="true"/>&ndash;&gt;
        <property name="maxLifetime" value="0"/>
        <property name="minPoolSize" value="1"/>
        <property name="maxPoolSize" value="10"/>
        <property name="poolSize" value="1"/>

    </bean>-->

    <!-- 配置SqlSessionFactoryBean -->
<!--    <bean id="sqlSessionFactoryMain"
          class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="transactionFactory">
            <bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory"/>
        </property>
        &lt;!&ndash; configLocation为mybatis属性 mapperLocations为所有mapper&ndash;&gt;
        <property name="configLocation" value="classpath:conf/mybatis-config.xml"></property>
        <property name="mapperLocations" value="classpath:mapper/main/*.xml"></property>
        <property name="dataSource" ref="dataSourceMain"/>

    </bean>-->

    <bean id="sqlSessionFactoryUser"
          class="org.mybatis.spring.SqlSessionFactoryBean">

        <property name="transactionFactory">
            <bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory"/>
        </property>
        <!-- configLocation为mybatis属性 mapperLocations为所有mapper-->
        <property name="configLocation" value="classpath:conf/mybatis-config.xml"></property>
        <property name="mapperLocations" value="classpath:mapper/user/*.xml"></property>
        <property name="dataSource" ref="dataSourceUser"/>
    </bean>
    <!--<bean id="sqlSessionFactoryLog"
          class="org.mybatis.spring.SqlSessionFactoryBean">

        <property name="transactionFactory">
            <bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory"/>
        </property>
        &lt;!&ndash; configLocation为mybatis属性 mapperLocations为所有mapper&ndash;&gt;
        <property name="configLocation" value="classpath:conf/mybatis-config.xml"></property>
        <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
        <property name="dataSource" ref="dataSourceLog"/>
    </bean>
    <bean id="sqlSessionFactoryReport"
          class="org.mybatis.spring.SqlSessionFactoryBean">

        <property name="transactionFactory">
            <bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory"/>
        </property>
        &lt;!&ndash; configLocation为mybatis属性 mapperLocations为所有mapper&ndash;&gt;
        <property name="configLocation" value="classpath:conf/mybatis-config.xml"></property>
        <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
        <property name="dataSource" ref="dataSourceReport"/>
    </bean>
    <bean id="sqlSessionFactoryMeal"
          class="org.mybatis.spring.SqlSessionFactoryBean">

        <property name="transactionFactory">
            <bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory"/>
        </property>
        &lt;!&ndash; configLocation为mybatis属性 mapperLocations为所有mapper&ndash;&gt;
        <property name="configLocation" value="classpath:conf/mybatis-config.xml"></property>
        <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
        <property name="dataSource" ref="dataSourceMeal"/>
    </bean>-->
    <!-- configLocation为mybatis属性 mapperLocations为所有mapper-->

    <!-- spring与mybatis整合配置,扫描所有dao -->
    <!--<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
          p:basePackage="mapper"
          p:sqlSessionFactoryBeanName="sqlSessionFactoryMain"/>-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
          p:basePackage="mapper"
          p:sqlSessionFactoryBeanName="sqlSessionFactoryUser"/>
    <!--<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
          p:basePackage="mapper"
          p:sqlSessionFactoryBeanName="sqlSessionFactoryLog"/>
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
          p:basePackage="mapper"
          p:sqlSessionFactoryBeanName="sqlSessionFactoryReport"/>
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
          p:basePackage="mapper"
          p:sqlSessionFactoryBeanName="sqlSessionFactoryMeal"/>-->


    <!-- JTA事务管理器 -->
    <bean id="userTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp"
          init-method="init" destroy-method="shutdownForce" >
        <constructor-arg>
            <!-- IMPORTANT: specify all Atomikos properties here -->
            <props>
                <prop key="com.atomikos.icatch.no_file">true</prop>
                <prop key="com.atomikos.icatch.service">com.atomikos.icatch.standalone.UserTransactionServiceFactory
                </prop>
                <prop key="com.atomikos.icatch.output_dir">target/</prop>
                <prop key="com.atomikos.icatch.log_base_dir">target/</prop>
            </props>
        </constructor-arg>
    </bean>
    <bean id="atomikosTransactionManager"
          class="com.atomikos.icatch.jta.UserTransactionManager"
          init-method="init" destroy-method="close"
          depends-on="userTransactionService">
        <!-- IMPORTANT: disable startup because the userTransactionService above does this -->
        <property name="startupTransactionService" value="false"/>
        <!-- 当调用close时, 我们应该强制交易终止还是不终止?    -->
        <property name="forceShutdown" value="false"/>
    </bean>
    <bean id="atomikosUserTransaction"
          class="com.atomikos.icatch.jta.UserTransactionImp"
          depends-on="userTransactionService">
        <property name="transactionTimeout" value="300"/>
    </bean>
    <!--设置Atomikos的系统参数并-->
    <bean id="setMyAtomikosSystemProps"
          class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetObject">
            <!-- System.getProperties() -->
            <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
                <property name="targetClass" value="java.lang.System"/>
                <property name="targetMethod" value="getProperties"/>
            </bean>
        </property>
        <property name="targetMethod" value="putAll"/>
        <property name="arguments">
            <!-- The new Properties -->
            <util:properties>
                <prop key="com.atomikos.icatch.file">classpath:conf/transactions.properties
                </prop>
                <prop key="com.atomikos.icatch.hide_init_file_path">true</prop>
            </util:properties>
        </property>
    </bean>
    <!--声明JTA的事务管理机制-->
    <bean id="jtaTransactionManager"
          class="org.springframework.transaction.jta.JtaTransactionManager"
          depends-on="userTransactionService">
        <property name="transactionManager" ref="atomikosTransactionManager"/>
        <property name="userTransaction" ref="atomikosUserTransaction"/>
        <!-- 必须设置,否则程序出现异常 JtaTransactionManager does not support custom isolation levels by default -->
        <property name="allowCustomIsolationLevels" value="true"/>
    </bean>
    <!--声明atomikos的事务代理-->
    <bean id="atomikosTransactionProxy"
          class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
          abstract="true">
        <property name="transactionManager">
            <ref bean="jtaTransactionManager"/>
        </property>
        <property name="transactionAttributes">
            <props>
                <prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
            </props>
        </property>
    </bean>

     <!--支持 @AspectJ 标记-->
    <!--<aop:aspectj-autoproxy />-->
    <!-- 以AspectJ方式 定义 AOP -->
    <!--<aop:config proxy-target-class="true">-->
        <!--<aop:advisor pointcut="execution(* service.impl.*.*(..))" advice-ref="txAdvice" order="5"/>-->
    <!--</aop:config>-->
    <!-- 配置事务传播特性:如果存在一个事务,则支持当前事务。如果没有事务则开启:REQUIRED -->
    <!--<tx:advice id="txAdvice" transaction-manager="jtaTransactionManager">-->
        <!--<tx:attributes>-->
            <!--&lt;!&ndash;<tx:method name="add*" propagation="REQUIRED" rollback-for="Exception"/>-->
            <!--<tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>-->
            <!--<tx:method name="insert*" propagation="REQUIRED" rollback-for="Exception"/>-->
            <!--<tx:method name="create*" propagation="REQUIRED" rollback-for="Exception"/>-->
            <!--<tx:method name="del*" propagation="REQUIRED" rollback-for="Exception"/>-->
            <!--<tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>-->
            <!--<tx:method name="modify*" propagation="REQUIRED" rollback-for="Exception"/>&ndash;&gt;-->
            <!--<tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>-->
        <!--</tx:attributes>-->
    <!--</tx:advice>-->

    <!--将atomikosTransactionProxy作用于service上-->
    <bean id="userService" parent="atomikosTransactionProxy">
        <property name="target">
            <bean class="service.impl.UserServiceImpl">
            </bean>
        </property>
    </bean>


</beans>

6、配置jta事物日志文件transactions.properties

# SAMPLE PROPERTIES FILE FOR THE TRANSACTION SERVICE
# THIS FILE ILLUSTRATES THE DIFFERENT SETTINGS FOR THE TRANSACTION MANAGER
# UNCOMMENT THE ASSIGNMENTS TO OVERRIDE DEFAULT VALUES;
# Required: factory implementation class of the transaction core.
# NOTE: there is no default for this, so it MUST be specified!
#
com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
# Set base name of file where messages are output
# (also known as the 'console file').
#
com.atomikos.icatch.console_file_name=tm.out
# Size limit (in bytes) for the console file;
# negative means unlimited.
#
# com.atomikos.icatch.console_file_limit=-1
# For size-limited console files, this option
# specifies a number of rotating files to
# maintain.
#
# com.atomikos.icatch.console_file_count=1
# Set the number of log writes between checkpoints
#
# com.atomikos.icatch.checkpoint_interval=500
# Set output directory where console file and other files are to be put
# make sure this directory exists!
#
# com.atomikos.icatch.output_dir = ./
# Set directory of log files; make sure this directory exists!
#
# com.atomikos.icatch.log_base_dir = ./
# Set base name of log file
# this name will be  used as the first part of
# the system-generated log file name
#
com.atomikos.icatch.log_base_name=tmlog
# Set the max number of active local transactions
# or -1 for unlimited.
#
# com.atomikos.icatch.max_actives = 50
# Set the default timeout (in milliseconds) for local transactions
#
# com.atomikos.icatch.default_jta_timeout = 10000
# Set the max timeout (in milliseconds) for local transactions
#
# com.atomikos.icatch.max_timeout = 300000
# The globally unique name of this transaction manager process
# override this value with a globally unique name
#
com.atomikos.icatch.tm_unique_name=tm
# Do we want to use parallel subtransactions? JTA's default
# is NO for J2EE compatibility
#
# com.atomikos.icatch.serial_jta_transactions=true
# If you want to do explicit resource registration then
# you need to set this value to false.
#
# com.atomikos.icatch.automatic_resource_registration=true
# Set this to WARN, INFO or DEBUG to control the granularity
# of output to the console file.
#
com.atomikos.icatch.console_log_level=INFO
# Do you want transaction logging to be enabled or not?
# If set to false, then no logging overhead will be done
# at the risk of losing data after restart or crash.
#
# com.atomikos.icatch.enable_logging=true
# Should two-phase commit be done in (multi-)threaded mode or not?
# Set this to false if you want commits to be ordered according
# to the order in which resources are added to the transaction.
#
# NOTE: threads are reused on JDK 1.5 or higher.
# For JDK 1.4, thread reuse is enabled as soon as the
# concurrent backport is in the classpath - see
# http://mirrors.ibiblio.org/pub/mirrors/maven2/backport-util-concurrent/backport-util-concurrent/
#
# com.atomikos.icatch.threaded_2pc=false
# Should shutdown of the VM trigger shutdown of the transaction core too?
#
# com.atomikos.icatch.force_shutdown_on_vm_exit=false
com.atomikos.icatch.serial_jta_transactions=false.

7、配置log4j日志文件

# Set root logger level to WARN and append to stdout
log4j.rootLogger=WARN, stdout, error
#WARN\u4E3Alog\u8F93\u51FA\u7EA7\u522B\uFF0Cstdout\uFF0Cerror\u4E3A\u8BE5log\u7684\u522B\u540D\uFF0C\u4E0B\u9762\u5C06\u7528\u5230
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%c:%L) - %m%n
# Print only messages of level ERROR or above in the package noModule.
log4j.logger.noModule=FATAL
# OpenSymphony Stuff
log4j.logger.com.opensymphony=INFO
log4j.logger.com.opensymphony.webwork=DEBUG
# Spring Stuff
log4j.logger.org.springframework=INFO
#log4j.logger.com.ibatis=DEBUG
#log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
#log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
#log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
#log4j.logger.java.sql.Connection=DEBUG
#log4j.logger.java.sql.Statement=DEBUG
#log4j.logger.java.sql.PreparedStatement=DEBUG
#################################
#                       \u9519\u8BEF\u4FE1\u606F #
#################################
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.File=D:/WorkSpace/LovingCar/logs/errors.log
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=[%d]-%-5p (%F:%L)|%m%n
log4j.appender.error.DatePattern='.'yyyy-MM-dd
log4j.appender.error.Threshold=ERROR
###################################
#                       CONSOLE #
#################################
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=(%F:%L)|%m%n
log4j.appender.errorcsle=org.apache.log4j.ConsoleAppender
log4j.appender.errorcsle.layout=org.apache.log4j.PatternLayout
log4j.appender.errorcsle.layout.ConversionPattern=%-5p (%F:%L)|%m%n
log4j.appender.errorcsle.Threshold=ERROR
##################################
#                       \u4E1A\u52A1\u7CFB\u7EDF #
#################################
log4j.logger.cn.vesung=DEBUG, logic
log4j.appender.logic=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logic.File=D:/WorkSpace/LovingCar/logs/logic.log
log4j.appender.logic.layout=org.apache.log4j.PatternLayout
log4j.appender.logic.layout.ConversionPattern=[%d]-%-5p (%F:%L)|%m%n
log4j.appender.logic.DatePattern='.'yyyy-MM-dd

8、配置web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<!--
  - This is the Cocoon web-app configurations file
  -
  - $Id$
  -->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>Catering</display-name>
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>classpath:conf/log4j.properties</param-value>
    </context-param>

    <context-param>
        <param-name>log4jRefreshInterval</param-name>
        <param-value>60000</param-value>
    </context-param>
    <!-- Servlet Context Listener ======================================= -->
    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 读取spring配置文件 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:conf/applicationContext.xml
            classpath:conf/spring-mybatis.xml
        </param-value>
    </context-param>
    <!-- Servlet Filters ================================================ -->
    <!-- Spring字符集过滤器 -->
    <filter>
        <filter-name>SpringEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>SpringEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


    <!-- Servlet Configuration ========================================== -->
    <!-- springMVC核心配置 -->
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:conf/spring-mvc.xml,classpath:conf/applicationContext.xml</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

9、controller

package controller;

import model.user.UserVerificationCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import service.UserService;

/**
 * Author:LiHongMei
 * Date:2017/1/9 15:00
 */
@Controller
@RequestMapping("/user")
public class UserController {

   @Autowired
   private UserService userService;

   @RequestMapping(value = "/getCodes", method = RequestMethod.GET, headers = "Accept=application/json",
         produces = "application/json;charset=UTF-8;")
   @ResponseBody
   public UserVerificationCode getCodes(){
      UserVerificationCode userVerificationCode = userService.getCode();
      return userVerificationCode;
   }


}

10、mapper

package mapper.user;

import model.user.UserVerificationCode;

public interface UserVerificationCodeMapper {
    int deleteByPrimaryKey(String uuid);

    int insert(UserVerificationCode record);

    int insertSelective(UserVerificationCode record);

    UserVerificationCode selectByPrimaryKey(String uuid);

    int updateByPrimaryKeySelective(UserVerificationCode record);

    int updateByPrimaryKey(UserVerificationCode record);

}

11、service

package service.impl;

import mapper.user.UserVerificationCodeMapper;
import model.user.UserVerificationCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import service.UserService;

/**
 * Author:LiHongMei
 * Date:2017/1/9 15:05
 */
@Service("userService")
public class UserServiceImpl implements UserService {

   @Autowired
   private UserVerificationCodeMapper userVerificationCodeMapper;

   @Override
   public UserVerificationCode getCode() {
      return userVerificationCodeMapper.selectByPrimaryKey("1");
   }
}

12、test

package controller.test;

import controller.UserController;
import model.user.UserVerificationCode;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * Author:LiHongMei
 * Date:2017/1/9 15:14
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:conf/applicationContext.xml", "classpath:conf/spring-mvc.xml",
      "classpath:conf/mybatis-config.xml", "classpath:conf/spring-mybatis.xml"})
public class UserControllerTest {

   // 模拟request,response
   private MockHttpServletRequest request;

   private MockHttpServletResponse response;

   // 执行测试方法之前初始化模拟request,response
   @Before
   public void setUp() {
      request = new MockHttpServletRequest();
      request.setCharacterEncoding("UTF-8");
      response = new MockHttpServletResponse();
   }

   @Autowired
   private UserController userController;

   @Test
   public void getCodes() throws Exception {
      UserVerificationCode userVerificationCode = userController.getCodes();
      System.out.println(userVerificationCode.toString());
   }

}

 

转载于:https://my.oschina.net/u/2289161/blog/1162490

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值