正确配置spring mvc app

时间:2013-11-27 08:17:19

标签: java spring spring-mvc

我读到这一点“最佳做法是在业务逻辑组件和数据访问类(通常在ApplicationContext中定义)和Web相关组件(如控制器和视图)之间保持明确的分离。解析器(在每个Dispatcher Servlet的WebApplicationContext中定义)。“

并决定将我的应用程序配置为4个单独的xml文件

的applicationContext.xml

<context:component-scan base-package="appname">
         <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan> 

dao.xml

<!-- MySQL JDBC Data Source-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>        
        <property name="url" value="jdbc:mysql://#{mysqlDbCredentials.hostname}:#{mysqlDbCredentials.port}/#{mysqlDbCredentials.name}"/>
        <property name="username" value="#{mysqlDbCredentials.username}"/>
        <property name="password" value="#{mysqlDbCredentials.password}"/>
    </bean>

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="JpaPersistenceUnit" />
        <property name="dataSource" ref="dataSource" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true"/>               
                <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"/>
            </bean>
        </property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.showSql">true</prop>
            </props>
        </property>        
    </bean>

    <bean class="org.springframework.orm.jpa.JpaTransactionManager"
          id="transactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

和mvc-dispatcher-servlet.xml

   <mvc:annotation-driven />  
    <context:component-scan base-package="appname" use-default-filters="false">
         <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>   

web.xml(加载弹簧上下文)

   <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param> 
            <param-name>contextConfigLocation</param-name> 
            <param-value> 
              /WEB-INF/spring/mvc-dispatcher-servlet.xml
            </param-value> 
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/spring/*</url-pattern>
    </servlet-mapping>

    <!-- Load spring beans definition files -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring/applicationContext.xml
            /WEB-INF/spring/security.xml
            /WEB-INF/spring/dao.xml
        </param-value>
    </context-param>

但我绝对糊涂了。 1)我不明白在这种情况下我得到了多少背景 2)我想在aspectj上轻松替换tx模式(我知道它只在ome上下文中工作)。但是当我替换时,我会得到错误的转换。

我希望这两种交易都具有通用变体的主要问题 在这里,我添加mode="aspectj",我有@Service,@ Resourse等注释,具体类

 <tx:annotation-driven transaction-manager="transactionManager" mode="aspectj" proxy-target-class="true"/>

所有似乎都应该有效,但我在flush

上得到了下一个例外
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.persistence.TransactionRequiredException: no transaction is in progress
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:948)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:575)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1239)
at [internal classes]
at org.apache.logging.log4j.core.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:66)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:194)
at [internal classes]
Caused by: javax.persistence.TransactionRequiredException: no transaction is in progress
at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:993)
at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-2)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

请帮助我理解

1 个答案:

答案 0 :(得分:3)

约定是你有一个根上下文,通常是applicationContext.xml。然后是不同的servlet上下文(针对不同的模块/功能)... myapp-servlet.xml。

servlet上下文可以在根上下文中查看所有内容,但不能以其他方式查看。控制器和webby东西(静态资源)进入servlet上下文,其他所有东西(例如服务和安全性)都进入根上下文。

您可以随意导入不同的文件。但是在web.xml中定义这两个上下文(或Java conf等价物)。

我仍然采用老式的xml方式,你没有来使用java conf。

你的实际错误是什么?