2012-02-23 1 views
2

この問題の解決策を見つけるのに3日を費やしています。私はこれを理解することを切望している。サーブレット2.5でjstlタグ1.2を実行し、Spring 3.1でtomcatで動作し、hibernateとhibernate jpaの実装を使用するシンプルなSpringアプリケーションがあります。Spring 3.1 JPAがtomcatで実行中にデータを挿入しない

ページからデータを表示できますが、挿入を完了できません。記録は元に戻り、問題なく発射されるように見える。しかし、挿入は行われません。私は他のポストが似ていることを知っていますが、私はそれらをすべて見て、どこでも解決策を見つけることができませんでした。

MAINクラスを使用して同じコードを実行すると、挿入が正常に動作します。 TomcatでWebアプリとして実行しているときはうまくいきません。

私はサービスレイヤを呼び出すのをスキップして、インターフェイスに直接移動しようとしたコントローラの内部で、動作しているメインを介してこれを実行しようとしましたが、そのときはDAOクラスを実装しようとしました。それは仕事をしなかった。 Springログを介して、エンティティマネージャが作成され、トランザクションが行われる前にシャットダウンされるように見えます。

私を助けてください。ここで

  package com.naturalbornliar.site.mvc; 

      import javax.inject.Inject; 

      import org.apache.log4j.Logger; 
      import org.springframework.stereotype.Controller; 
      import org.springframework.ui.Model; 
      import org.springframework.validation.BindingResult; 
      import org.springframework.web.bind.annotation.RequestMapping; 
      import org.springframework.web.bind.annotation.RequestMethod; 

      import com.naturalbornliar.site.entity.Category; 
      import com.naturalbornliar.site.entity.Link; 
      import com.naturalbornliar.site.service.CategoryService; 


      @Controller 
      @RequestMapping("/categories") 
      public class CategoryController { 


       protected final Logger logger = Logger.getLogger(CategoryController.class); 

       private final CategoryService categoryService; 

       @Inject 
       public CategoryController(CategoryService categoryService){ 
        this.categoryService = categoryService; 
       } 

       @RequestMapping(value="/listCategories") 
       public String listLinks(Model model){ 

        model.addAttribute("categories", categoryService.getAllCategories()); 

        return "categories"; 
       } 

       @RequestMapping(method=RequestMethod.GET, params="new") 
       public String showCreateCategoryForm(Model model){ 
        model.addAttribute(new Category()); 
        return "addcategory"; 
       } 

       @RequestMapping(method=RequestMethod.POST) 
       public String addCategoryFromForm(Category category, BindingResult bindingResult){ 
        if(bindingResult.hasErrors()){ 
         return"addcategory"; 
         } 
        categoryService.addCategory(category); 
        return "redirect:/categories/listCategories"; 
       } 
      } 

は、コントローラから呼び出された私のサービスである:ここで

  package com.naturalbornliar.site.service; 

      import java.util.Collection; 

      import javax.inject.Inject; 

      import org.springframework.stereotype.Service; 

      import com.naturalbornliar.site.entity.Category; 
      import com.naturalbornliar.site.i.ICategoryDao; 

      @Service 
      public class CategoryService { 

       private ICategoryDao iCategoryDao; 

       @Inject 
       public CategoryService(ICategoryDao iCategoryDao){ 
        this.iCategoryDao = iCategoryDao; 
       } 

       public Collection<Category> getAllCategories(){ 
        return iCategoryDao.getAllCategories(); 
       } 

       public Collection<Category> getCategoriesByType(String type) { 
        return iCategoryDao.getCategoriesByType(type); 
       } 

       public Category getCategoryById(Long id) { 
        throw new UnsupportedOperationException(); 
       } 

       public void deleteCategory(Category category) { 
        throw new UnsupportedOperationException(); 
       } 

       public void updateCategory(Category category) { 
        throw new UnsupportedOperationException(); 
       } 

       public void inactivateCategory(Category category){ 
        throw new UnsupportedOperationException(); 
       } 

       public void addCategory(Category category){ 
        iCategoryDao.addCategory(category); 
       } 
      } 

は私の実装DAOです。ここ

は私のApp-コンテキストは、ここで

  <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:aop="http://www.springframework.org/schema/aop" 
        xmlns:tx="http://www.springframework.org/schema/tx" 
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd 
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd" 
        default-autowire="byName"> 

       <context:component-scan base-package="com.naturalbornliar.site"/> 
       <tx:annotation-driven /> 
       <!-- Bean declarations go here--> 

       <bean id="duke" class="com.naturalbornliar.site.entity.Admin"> 
        <constructor-arg name="admin_id" type="Long" value="15" /> 
        <constructor-arg name="admin_login" type="String" value="testUser" /> 
        <constructor-arg name="admin_pwd" type="String" value="testPwd" /> 
        <constructor-arg name="email_id" type="int" value="15" /> 
        <constructor-arg name="quote" type="String" value="Something to say here" />  
       </bean> 

      <!-- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> --> 
      <!--  <property name="driverClassName" value="com.mysql.jdbc.Driver"/> --> 
      <!--  <property name="url" value="jdbc:mysql://localhost:3306/nbl_db"/> --> 
      <!--  <property name="username" value="web_user"/> --> 
      <!--  <property name="password" value="web_pwd"/> --> 
      <!--  <property name="initialSize" value="5"/> --> 
      <!--  <property name="maxActive" value="10"/> --> 
      <!-- </bean> --> 

       <bean id="simpledataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
        <property name="url" value="jdbc:mysql://localhost:3306/nbl_db"/> 
        <property name="username" value="web_user"/> 
        <property name="password" value="web_pwd"/> 
       </bean> 

       <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
        <constructor-arg ref="simpledataSource"/> 
       </bean> 

       <bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
        <property name="persistenceUnitName" value="nblPersistenceUnit"/> 
        <property name="dataSource" ref="simpledataSource"/> 
        <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/> 
       </bean> 

      <!-- <bean id="emf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> --> 
      <!--  <property name="persistenceUnitName" value="nblPersistenceUnit"/> --> 
      <!--  <property name="dataSource" ref="simpledataSource"/>--> 
      <!--  <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/> --> 
      <!-- </bean> --> 

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

       <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/> 

       <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
        <property name="database" value="MYSQL"/> 
        <property name="showSql" value="true"/> 
        <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/> 
       </bean> 

       <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> 

       <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 

       <tx:advice id="txAdvice"> 
        <tx:attributes> 
         <tx:method name="add*" propagation="REQUIRED"/> 
         <tx:method name="delete*" propagation="REQUIRED"/> 
         <tx:method name="*" propagation="SUPPORTS" read-only="true"/> 
        </tx:attributes> 
       </tx:advice> 

       <aop:config> 

        <aop:advisor pointcut="execution(* *..CategoryDaoImpl.*(..))" advice-ref="txAdvice"/> 

       </aop:config> 

       </beans> 

は私のコントローラであります:

ここでは210

インターフェイス(念のため)

  package com.naturalbornliar.site.i; 

      import java.util.Collection; 

      import com.naturalbornliar.site.entity.Content; 

      public interface IContentDao { 

       public void addContent(Content content); 
       public void deleteContent(Content content); 
       public void inactivateContent(Content content); 
       public Content getContentById(Long id); 
       public Content getContentByName(String name); 
       public Collection<Content> getAllObjects(); 

      } 

答えて

2

さて、私は実際に問題を解決しました。基本的にすべての

Spring @Transaction not starting transactions

私が追加したため、正しく起動するように取引のために必要だった:ここに解決策があり、それを解決した別のstackoverflowの問題があったと

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

は私サーブレットxml。私は、アプリケーションのconfig.xmlでそれを持っているかどうかは、コンテナで実行する必要がある場合はメインクラス(スタンドアロンのような)の下で実行するときだけ動作し、サーブレットのトランザクションアノテーションも宣言しなければならないと思います。

2

ジェレミーで、持ち運びにくいはそれで多くの問題とすることができ、私は同様の問題がありました。

私の場合、私はtomcatを使用しました。私はTomcatにspring weaverを追加する必要がありました(この問題はここで説明しています:http://asrijaffar.blogspot.com/2007/02/spring-jpa-tomcat.html)。私の場合は

は私が持っているために必要な:DispatcherServletの設定で

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

。 DB-コンテキストの設定でさらに

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="jpatest" /> 
</bean> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 
+0

ミハルのようになります、私は春のウィーバーを必要とする理由を理解しないと思いますか?あなたが言及したプロキシターゲットを追加しました(私は過去にそれを持っていましたが、それでもまだ仕事はありませんでした)。しかし、再追加以来、それは仕事をしませんでしたが、私はそのリンクごとにセットアップスプリングウィーバーをまだ持っていません。なぜ私はスプリングウィーバーが必要なのですか?それは何ですか? – jeremy

+0

私は実際問題を解決しました。ここでは解決策は、それを解決する別のスタックオーバーフローの問題があった: http://stackoverflow.com/questions/7561360/spring-transaction-not-starting-transactions 基本的には、私に追加する: to my servlet xml。私は、アプリケーションのconfig.xmlでそれを持っているかどうかは、コンテナで実行する必要がある場合はメインクラス(スタンドアロンのような)の下で実行するときだけ動作し、サーブレットのトランザクションアノテーションも宣言しなければならないと思います。 – jeremy

0

同じスタックを使用していた以前のアプリケーションが正常に動作していても、何か問題がどこにあるかを調べるのに数時間を費やしましたが、その違いを理解できませんでした。

そして....エラーがバネservlet.xmlタグにあった - それは等すべてのWebコントローラ、リポジトリクラス、

とルートパッケージをスキャンするために定義されたスキャンを行うためにそれを変更した後あなたは私もこれと同じ問題を抱えていた

0

同じ問題、単に追加のヒントを満たす可能性がある場合にのみ、問題は消えていたウェブコントローラとのパッケージ..(私のためにと)

ちょうどあなたのための

の、使用されたカップルナイトの検索 - alexのソリューションが私をサーブレットxmlに保存しました。コンテキストを変更しました。コンポーネントスキャンは、Webコントローラでのみパッケージをスキャンします。このページから 例

<context:component-scan base-package="com.naturalbornliar.site.mvc"/> 
関連する問題