Spring에서 트랜잭션을 처리하는 데 문제가 있습니다. 필자는 일정 횟수의 반복 작업을 수행하고 매번 Oracle 데이터베이스에 레코드를 삽입하는 웹 서비스를 제공합니다. 내 서비스의 삽입 메소드를 @Transactional로 표시했다. 왜냐하면 삽입이 실패 할 때마다 (RuntimeException 다음에, 즉 삽입 될 null 객체의 경우) 롤백하기를 원하기 때문이다.Spring 컨텍스트에 의해 인스턴스화되지 않은 클래스에서 Spring 트랜잭션이 롤백되지 않습니다.
문제점은 Java로 서비스를 테스트 할 때 Spring 애플리케이션 컨텍스트를 통해 서비스를 인스턴스화하는 주에서 evertything이 제대로 작동한다는 것입니다 (모든 레코드가 롤백 됨). 대신 웹 서비스를 soapUI로 테스트하면 로컬 서버에 배포 한 후 @Transactional 주석이 보이지 않는 것입니다.
내 코드를보고합니다. 여기 내 주요의
@Service
public class MyService{
@Transactional
public void insert(List<DAO> l) {
for(DAO item : l) {
//Insert item into the DB
//and throw a RunTimeException in case of failure (i.e.,item null)
}
}
}
:
여기 내 서비스의 나는 Spring 애플리케이션 컨텍스트와 웹 서비스를 인스턴스화 할 때
public class TestMain{
public static void main(String[] args) {
ApplicationContext ac = new FileSystemXmlApplicationContext(SPRING_CONTEXT_XML_PATH);
MyService service = ac.getBean(MyService .class);
List<DAO> l; //Suppose it is initialized
service.insert(l); //Rollback working if RuntimeException is thrown
}
}
내가 말했듯이, 위의 코드가 작동, 그러나 서버에 전개 한 후에 soapUI를 통해 MyService를 호출하면 실제로 서비스가 수행되는 것이므로 @Transactional은 실행되지 않습니다.
누군가 내게이 동작을 설명 할 수 있습니까?
대단히 감사합니다.
이 웹 서비스를 호출하는 SOAP 코드를 공유 할 수 있습니까? 끝점에서 'MyService'를 가져오고 호출하는 방법은 무엇입니까? –