2013-11-27 183 views
1

我讀過「這是一個最佳實踐,以保持業務邏輯組件和數據訪問類(通常在ApplicationContext中定義的)等中間層服務與Web相關的最佳實踐組件,如控制器和視圖解析器(在每個Dispatcher Servlet的WebApplicationContext中定義)。「春天mvc應用程序的正確配置

,並決定配置我的應用程序一樣,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-調度 - 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) 

請給下一個異常,幫我uderstand更好

+0

是否有使用XML的特定原因?我發現使用JavaConfig模塊化配置要簡單得多。 – chrylis

+0

@chrylis只是一個習慣,需要快速製作 – Ray

+0

您獲得的上下文取決於所有這些文件如何加載。我沒有看到任何進口其他東西的東西; Spring如何發現所有這些?值得一提的是,我經常將應用程序構建爲多個模塊的Maven項目,並且我包含了適當的@ @ Configuration'類,並且只是從單個入口點(最近的Spring Boot)掃描它們,而是傳統的XML文件第一個也會工作。 – chrylis

回答

3

慣例是你有一個根上下文,通常是applicationContext.xml。然後,不同的servlet上下文(針對不同的模塊/功能)...... myapp-servlet.xml。

servlet上下文可以看到根上下文中的所有內容,但不是其他方式。控制器和webby的東西(靜態資源)進入servlet上下文,其他所有內容(例如服務和安全)都進入根上下文。

您可以隨意導入不同的文件。但是在你的web.xml(或者Java conf的等價物)中定義這兩個上下文。

我仍舊用老式的xml方式做,你不用就得用來使用java conf。

什麼是您的實際錯誤?

+0

我添加了詳細的描述我的問題。請閱讀更新的變體 – Ray

+0

您是否真的使用@Transactional註釋了服務類? – NimChimpsky

+0

是的,'@Service @Transactional public class MyServiceImpl' – Ray

相關問題