Управляемая контейнером транзакция в JAX-WS, weblogic - PullRequest
3 голосов
/ 14 декабря 2011

Я пытаюсь использовать управляемые контейнером транзакции внутри веб-сервиса, но транзакция не создана.У меня есть что-то вроде этого:

@WebService(...)
@Stateless
@TransactionManagment(TransactionManagmentType.CONTAINER)
public class ExampleService {

  // EntityManager and other fields

  @TransactionAttribure(TransactionAttributeType.REQUIRED)
  public void test(String s){
     // persist something with EntityManager
  }
}

Когда я вызываю этот метод, я получаю javax.persistence.TransactionRequiredException: метод public abstract voidвызывается в контексте транзакции.

Что я делаю не так?Спасибо!

1 Ответ

1 голос
/ 15 декабря 2011

Из того, что я помню, «TransactionAttributeType.REQUIRED» означает, что метод должен вызываться только тогда, когда транзакция уже выполняется для текущего потока (другими словами «вызывается в контексте транзакции»).Не ясно, кто, если кто-нибудь начнет транзакцию в вашем случае.Если никто, то исключение, которое вы получаете, имеет смысл.

Теперь я не уверен, как или вообще возможно в настоящее время распространять транзакции через вызов Web-сервисов.Я не думаю, что это особенно хорошая идея, даже если это возможно.

Возможно, вам нужен TransactionAttributeType.REQURES_NEW в вашем случае, чтобы Container запускал транзакцию перед передачей управления вашему аннотированному методу?

...