3

limsservice の監査メソッドに @Transactional アノテーションを付けないと、監査ログが永続化されません。しかし、persistenceService の永続化メソッドには既にこのアノテーションがあります。なぜこのアノテーションを付ける必要があるのですか。

  @RequestMapping(value = "/lemf", method = RequestMethod.POST, headers = "Accept=application/json")
    public
    @ResponseBody
    Lemf create(HttpServletResponse response, @RequestBody Lemf lemf) {
        try {
            Lemf l = limsService.findLemfByName(lemf.getName());
            if (l == null) {
                     lemf=   limsService.addLemf(lemf);
                    limsService.audit("User action",getRequestInfo(),"New lemf created.");
                     return  lemf;
            }
            sendError(response, "Lemf Allready exist.");


        } catch (ProviderException e) {
            sendError(response, e);
        }
        return null;
    }


public class PersistenceServiceImpl implements PersistenceService {

   @Transactional(readOnly = false)
    public <T extends Persistable> T persist(T obj) {
        if (obj.getSystemId() != AbstractPersistable.UNSAVED_ID_VALUE) {
            log.info("Updating... :" + obj);
            T merged = em.merge(obj);
            return merged;
        } else {
            em.persist(obj);
            return obj;
        }
    }

}


public class LimsServiceImpl implements LimsService {
  @Override
    public Lemf addLemf(Lemf lemf) throws ProviderException {
        return  persistenceService.persist(lemf);
    }

    @Transactional
    public void  audit(String type,Pair<String,String >  pair,String log)  {
         auditService. audit("User action", pair, "New lemf created.");
    }

}
4

1 に答える 1

1

Spring リファレンスの章10.5.6。@トランザクションの使用

これについては非常に明確です:

ヒント

Spring は、インターフェースにアノテーションを付けるのではなく、@Transactional アノテーションを使用して、具象クラス (および具象クラスのメソッド) にのみアノテーションを付けることをお勧めします。確かに @Transactional アノテーションをインターフェイス (またはインターフェイス メソッド) に配置できますが、これはインターフェイス ベースのプロキシを使用している場合に期待どおりにしか機能しません。Java アノテーションがインターフェースから継承されないという事実は、クラスベースのプロキシ (proxy-target-class="true") またはウィービングベースのアスペクト (mode="aspectj") を使用している場合、トランザクション設定がプロキシおよびウィービング インフラストラクチャによって認識されず、オブジェクトはトランザクション プロキシにラップされません。これは明らかに悪いことです。

于 2011-10-28T09:27:20.573 に答える