2010-12-03 106 views
1

我有一個如下定義的EJB(使用Java EE 6註釋編碼):如何將EJB公開爲非事務性的Web服務?

@Stateless 
@WebService 
public class SecurityWebService { 

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

注意,此EJB也被暴露爲web服務。但是,我遇到了生成的Web服務的問題。由我的容器(GlassFish)生成的WSDL包含WS-Atomic事務策略,因爲默認情況下無狀態會話Bean是事務性的(請參閱詳細信息here)。不幸的是,我的.NET客戶端在WSDL上窒息,因爲它不理解WS-AT策略。

所以我真正想要的是一個非乾淨的Web服務,它不是事務性的,但關聯的EJB應該是事務性的(它必須在數據庫中插入記錄)。我該怎麼做呢?我能想到的唯一的方法是創建一個傳遞到像這樣的EJB所有的所謂的「正常」的Web服務 - 不優雅可言:

@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) { 
     ... 
    } 
} 

有沒有更好的辦法?

謝謝。

納雷什

+0

爲什麼你的解決方案不夠優雅?這是責任的完全分離。非事務性Web服務具有與事務性EJB不同的責任。它也可以讓你稍後改變事情。 – jhyot 2015-10-23 07:46:54

回答

0

你可以試試註釋的方法:

@TransactionAttribute(TransactionAttributeType.NEVER) 

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 

說不上如果Web服務將挑選漲不跌,但它是值得一試。

編輯點評:

你試過REQUIRES_NEW嗎?他們可能不會傳播回Web服務。

否則,是的,你會被卡在事務部分與非事務性的Web服務。

+0

那麼,這確實會從WSDL中刪除WS-AT策略,但副作用是我的EJB現在變成了非事務性的。如上所述,這個bean需要執行數據庫事務,所以它必須是事務性的。 – Naresh 2010-12-03 04:12:11