将无状态 (Webservice)Bean 注入另一个 Bean
Inject Stateless (Webservice)Bean into another Bean
我尝试对 soap 服务进行版本控制进行一些测试。
我的想法是,业务逻辑始终实现最新版本,并且 soap 服务提供其功能。为了支持旧版本的接口,我想通过映射框架将 jaxb 类 映射到新版本,然后从旧端点调用端点实现。因此,在端点 v1 中,我注入端点 v2 并从那里调用它。但似乎 cdi 和 ejb 注入都不起作用:
@Stateless
@WebServiceProvider(serviceName = "WebserviceV1", wsdlLocation = "META-INF/wsdl/My.wsdl", targetNamespace = "http://smitch.ch/service/v1", portName = "ServicePortV1")
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class ServiceImplV1 implements ServicePortV1 {
private ModelMapper modelMapper = new ModelMapper();
@Inject
private ServiceImplV2 v2;
@PostConstruct
void configureMapping() {
PropertyMap<v1.RequestType, v2.RequesType> specialCase = new PropertyMap<>() {
protected void configure() {
//...
}
};
modelMapper.addMappings(specialCase);
}
@Override
public v1.ResponseType service(v1.RequestType soapRequest) {
v2.RequestType v2Request = map(soapRequest, v2.RequestType.class);
return map(v2.service(v2Request), v1.ResponseResponse.class);
}
}
版本 2 端点的定义方式大致相同,但在正文中实现了业务逻辑。
我总是得到错误
WELD-001408 Unsatisfied dependencies for type [ServiceImplV2] with qualifiers [@Default] at injection point [[field] @Inject private v1.ServiceImplV1.v2]"}}
我使用 JBoss EAP 6.3。
在处理网络服务端点时是否有一些特殊行为?
这里有更多信息。 类 都在同一个包中,是的,我有一个 beans.xml.
V2 看起来像:
@Stateless
@WebServiceProvider(serviceName = "WebserviceV2", wsdlLocation = "META-INF/wsdl/MyV2.wsdl", targetNamespace = "http://smitch.ch/service/v2", portName = "ServicePortV2")
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class ServiceImplV2 implements ServicePortV2 {
@Inject
private Processor processor;
@Override
public v2.ResponseType service(v2.RequestType soapRequest) {
return processor.process(soapRequest);
}
如 Jan 所述,尝试将 @LocalBean 添加到 ServiceImpleV2 以添加无界面视图。然后您应该能够使用@EJB 或@Inject 注入您的网络服务。
@Stateless
@LocalBean
@WebServiceProvider(serviceName = "WebserviceV2", wsdlLocation = "META-INF/wsdl/MyV2.wsdl", targetNamespace = "http://smitch.ch/service/v2", portName = "ServicePortV2")
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class ServiceImplV2 implements ServicePortV2 {
@Inject
private Processor processor;
@Override
public v2.ResponseType service(v2.RequestType soapRequest) {
return processor.process(soapRequest);
}
我尝试对 soap 服务进行版本控制进行一些测试。 我的想法是,业务逻辑始终实现最新版本,并且 soap 服务提供其功能。为了支持旧版本的接口,我想通过映射框架将 jaxb 类 映射到新版本,然后从旧端点调用端点实现。因此,在端点 v1 中,我注入端点 v2 并从那里调用它。但似乎 cdi 和 ejb 注入都不起作用:
@Stateless
@WebServiceProvider(serviceName = "WebserviceV1", wsdlLocation = "META-INF/wsdl/My.wsdl", targetNamespace = "http://smitch.ch/service/v1", portName = "ServicePortV1")
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class ServiceImplV1 implements ServicePortV1 {
private ModelMapper modelMapper = new ModelMapper();
@Inject
private ServiceImplV2 v2;
@PostConstruct
void configureMapping() {
PropertyMap<v1.RequestType, v2.RequesType> specialCase = new PropertyMap<>() {
protected void configure() {
//...
}
};
modelMapper.addMappings(specialCase);
}
@Override
public v1.ResponseType service(v1.RequestType soapRequest) {
v2.RequestType v2Request = map(soapRequest, v2.RequestType.class);
return map(v2.service(v2Request), v1.ResponseResponse.class);
}
}
版本 2 端点的定义方式大致相同,但在正文中实现了业务逻辑。
我总是得到错误
WELD-001408 Unsatisfied dependencies for type [ServiceImplV2] with qualifiers [@Default] at injection point [[field] @Inject private v1.ServiceImplV1.v2]"}}
我使用 JBoss EAP 6.3。 在处理网络服务端点时是否有一些特殊行为?
这里有更多信息。 类 都在同一个包中,是的,我有一个 beans.xml.
V2 看起来像:
@Stateless
@WebServiceProvider(serviceName = "WebserviceV2", wsdlLocation = "META-INF/wsdl/MyV2.wsdl", targetNamespace = "http://smitch.ch/service/v2", portName = "ServicePortV2")
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class ServiceImplV2 implements ServicePortV2 {
@Inject
private Processor processor;
@Override
public v2.ResponseType service(v2.RequestType soapRequest) {
return processor.process(soapRequest);
}
如 Jan 所述,尝试将 @LocalBean 添加到 ServiceImpleV2 以添加无界面视图。然后您应该能够使用@EJB 或@Inject 注入您的网络服务。
@Stateless
@LocalBean
@WebServiceProvider(serviceName = "WebserviceV2", wsdlLocation = "META-INF/wsdl/MyV2.wsdl", targetNamespace = "http://smitch.ch/service/v2", portName = "ServicePortV2")
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class ServiceImplV2 implements ServicePortV2 {
@Inject
private Processor processor;
@Override
public v2.ResponseType service(v2.RequestType soapRequest) {
return processor.process(soapRequest);
}