我们目前正在构建一个Web应用程序,其中后端通过REST Web服务(使用Jersey)公开服务器功能。但是,由于向后兼容性,有一个Web服务需要是SOAP服务。我们为此实现了一个POJO(使用Eclipse生成的Axis2 Web服务以获得正确的设置),我们在Tomcat上将其部署为Axis2 Web服务。 SOAP Web服务定义为请求范围(在 services.xml 中完成)。调用此Web服务,使用Kerberos和NTLM进行身份验证(哪一个取决于部署Web应用程序的环境)可以正常工作。
现在,我们希望重用REST服务的一些功能。 REST服务仅用作外观,业务逻辑在 @RequestScoped bean中实现,使用CDI和 @Inject 将其注入REST服务。如果我们可以将@RequestScoped bean注入到我们的POJO中,那将是完美的,但这似乎不起作用。要注入的bean也依赖于其他@RequestScoped bean,这些bean也使用CDI注入。基本上,它将导致整个对象依赖树实例化。
现在,我的问题是,这种情况一般是否可行,即使用CDI将@RequestScoped bean注入Axis2 POJO?如果没有,你有什么建议可以用不同的方式解决这个问题,即在Axis2 POJO中重用@RequestScoped bean吗?
以下是我们设置的一些代码示例:
POJO:
import javax.inject.Inject;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.transport.http.HTTPConstants;
public class MyService {
@Inject
private MyRequestScopedService mrss;
public MyResponse getSomeData(MyRequest myRequest) {
// some logic...
}
}
要注入的Bean:
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
@RequestScoped
public class MyRequestScopedService {
@Inject
private MyOtherRequestScopedService morss;
[...] // a few other beans are also injected
public SomeData getSomeData(SomeRequest someRequest) {
// some logic...
}
[...]
}
的services.xml
<service name="MyService" scope="request">
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<parameter name="ServiceClass" locked="false">com.domain.MyService</parameter>
</service>
如果您需要更多详情,请告诉我。