2017-09-11 6 views
0

스프링처럼 서비스 클래스에서 @Transactional 어노테이션을 무시합니다. 나는 약간의 q&a on SOblogs을 읽었지만 어떤 옵션도 저에게 효과가없는 것 같습니다.Spring이 @Transactional 어노테이션을 무시합니다.

  1. 나는 private 메소드를 호출하지 않습니다. 공용 메소드를 공용 인터페이스에서 호출합니다.
  2. 다른 클래스에서 메소드를 호출하고 있습니다 (즉, 같은 클래스에서 호출하지 않음).
  3. 내 "서비스"클래스는 @Component@Transactional으로 주석되어 있습니다.
  4. 내 "서비스 클래스는 인터페이스를 가지고, 나는 인터페이스를 사용하여 주입하고있어, 및 @Inject 주석
  5. 내가 대답 중 하나에 여기에 설명 된대로 proxy-target-class="true"을 추가하는 시도 -이.. 작동하지 않았다
  6. I을 'JAX-RS를 이용하여 M (봄 - MVC 생략)

를 오류가 I이 예외 가면 @Transactional(propagation = Propagation.MANDATORY)으로 어노테이션 DAO 층에서 발생 :.

org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory' 

을 다음은 관련된 클래스와 인터페이스를 나타내는 일반적인 코드입니다.

public interface IService<T extends BaseEntity> { 
    void save(T entity); 
} 

public abstract class AbstractService<T extends BaseEntity> implements IService<T> { 

    @Inject 
    private IDao dao; 

    @Override 
    public void save(T entity) { 
     dao.save(entity); 
    } 
} 

public interface IPersonService extends IService<PersonEntity> { 
     void saveAll(List<PersonEntity> persons); 
} 

@Component 
@Transactional 
public class PersonService extends AbstractService<PersonEntity> implements IPersonService { 

    @Override 
    public void saveAll(List<PersonEntity> persons) { 
     for (PersonEntity person : persons) { 
      super.save(person); 
     } 
    } 
} 

@Component 
public class PersonApi { 

    @Inject 
    private IPersonService personService; 

    public void saveAll(...) { 
     ... 
     personService.saveAll(persons); 
    } 
} 

아이디어가 있습니까?

+2

동일한 클래스에서 메소드를 호출하는 경우에는 아무런 문제가 없습니다. AOP는 내부 메소드 호출이 아닌 외부 메소드 호출에서만 작동합니다. 그러나 코드를 추가하지 않았으므로 오류가 어디에 있는지 알 수 없습니다. –

+0

그것이 작동하지 않는다고 생각하는 이유는 무엇입니까? 몇 가지 코드를 공유 할 수 있습니까? – Leffchik

+0

같은 클래스의 메서드를 호출하지 않습니다. 내가 말했듯이, 나는 그것의 인터페이스를 사용하여 서비스를 주입하고 있는데, 나는 그것을 인터페이스를 사용하여 호출한다. 일부 코드 샘플을 제공하기 위해 노력하고 있습니다 ... –

답변

0

그래서 추상 클래스에 @Transactional도 덧붙여 야합니다. 그렇지 않으면 작동하지 않습니다. 스프링 문서는 인터페이스에 대해서만 이야기합니다. 여기에서는 추상 클래스 메서드를 호출하므로 @Transactional이어야합니다.

@Transactional 
public abstract class AbstractService<T extends BaseEntity> implements IService<T> { 

    @Inject 
    private IDao dao; 

    @Override 
    public void save(T entity) { 
     dao.save(entity); 
    } 


}