我遇到同样的问题来自this answer,但我的环境使用Arquillian进行测试而不是OpenEJB。
我的问题是我以编程方式获取用户主体名称,虽然这在正在运行的应用程序中完美运行,但此调用在测试执行期间失败并出现以下异常:
javax.ejb.EJBException: java.lang.IllegalStateException
at org.jboss.ws.common.injection.ThreadLocalAwareWebServiceContext.getWebServiceContext(ThreadLocalAwareWebServiceContext.java:88)
at org.jboss.ws.common.injection.ThreadLocalAwareWebServiceContext.getUserPrincipal(ThreadLocalAwareWebServiceContext.java:74)
有什么方法可以让我的工作吗?通过模拟WebServiceContext或其他东西......
答案 0 :(得分:0)
我今天在测试时遇到了同样的问题。从我所看到的,处理程序没有Web Service状态的视图。如果这是Arquillian特有的,我不确定。
但是,这不是问题,因为SOAPMessageContext
方法的handleMessage
参数扩展了MessageContext
接口,因此您应该能够直接访问所需的任何内容。 SOAPMessageContext
,无需访问WebServiceContext
。我能看到的唯一明显的例外是用户主体。
@Override
public boolean handleMessage(SOAPMessageContext soapMessageContext) {
String value = (String) soapMessageContext.get("myKey");
}
只需添加一条注释,如果您想将对象放入MessageContext
地图并希望它在端点内可用,请务必设置范围:
soapMessageContext.put("myKey", "someValue");
soapMessageContext.setScope("myKey", MessageContext.Scope.APPLICATION);