2010-12-03 5 views
1

트랜잭션이 아닌 웹 서비스로 EJB를 노출하는 방법?

다음과 같이 정의 된 EJB (Java EE 6 주석을 사용하여 코딩 됨)가 있습니다.

@Stateless 
@WebService 
public class SecurityWebService { 

    public void registerUser(RegistrationRequest request) { 
     ... 
    } 
} 

이 EJB는 웹 서비스로도 노출됩니다. 그러나 생성 된 웹 서비스에 문제가 있습니다. 기본적으로 상태 비 저장 세션빈은 트랜잭션 (자세한 내용은 here 참조)이므로 컨테이너 (GlassFish)에서 생성 된 WSDL에는 WS-Atomic Transaction 정책이 포함되어 있습니다. 불행히도 내 .NET 클라이언트는 WS-AT 정책을 이해하지 못하기 때문에 WSDL에서 질식합니다.

그래서 내가 원하는 것은 트랜잭션이 아니지만 관련된 EJB가 트랜잭션이어야합니다 (데이터베이스에 레코드를 삽입해야 함) 좋은 깨끗한 웹 서비스입니다. 어떻게해야합니까? 내가 생각할 수있는 유일한 접근법은 이런 모든 EJB를 호출하는 "일반적인"웹 서비스를 만드는 것입니다 - 전혀 우아하지는 않습니다 :

@WebService 
public class SecurityWebService { 

    @Inject 
    private SecurityService securityService; 

    public void registerUser(RegistrationRequest request) { 
     securityService.registerUser(request); 
    } 
} 

@Stateless 
public class SecurityService { 

    public void registerUser(RegistrationRequest request) { 
     ... 
    } 
} 

더 좋은 방법이 있습니까?

고마워.

Naresh

+0

왜 솔루션이 우아하지 않습니까? 이것은 책임의 깨끗한 분리입니다. 비 트랜잭션 웹 서비스는 트랜잭션 EJB와는 다른 책임이 있습니다. 또한 나중에 주변 상황을 쉽게 변경할 수 있습니다. – jhyot

답변

0

당신은 방법에 주석을 시도 할 수 있습니다. 코멘트

편집 :

당신은 REQUIRES_NEW을 시도 했습니까? 그들은 웹 서비스로 다시 전파되지 않을 수도 있습니다.

그렇지 않으면 비 트랜잭션 웹 서비스로 트랜잭션 부분을 처리해야 할 것입니다.

+0

WS-AT 정책을 실제로 WSDL에서 제거하지만 부작용은 이제 내 EJB가 비 트랜잭션 성이되었다는 것입니다. 위에서 언급했듯이,이 bean은 데이터베이스 트랜잭션을 수행해야 트랜잭션이되어야합니다. – Naresh

+0

그런 다음 트랜잭션을 빈 관리 트랜잭션으로 바꿉니다. entitymanager에서 트랜잭션 객체를 가져오고, 트랜잭션을 시작하고, db 작업을 수행하고, 트랜잭션을 커밋합니다. 빈 관리 트랜잭션을 사용할 웹 서비스 EJB에 주석을다는 것을 잊지 마라. –

관련 문제