我需要为每个客户部署相同的 Web 服务。这@javax.jws.WebService
uses Object
作为方法参数和返回类型(导致<xs:anyType/>
在 wsdl 中)。 Web 服务的每个实例都与客户的 jar 一起部署在类路径上。该 jar 具有已知的结构,并包含客户端希望通过我的服务处理的 JAXB 注释的类。
问题是,当客户将其类的实例作为方法参数传递时,服务器端 JAXB 上下文将其解组到一些奇怪的 xerces dom 节点中,因为(据我所知)仅在部署期间@WebMethod
and @WebService
注释被扫描,正如已经说过的,它们都在处理Object
only.
简单来说,我需要提示 JAXBWEB-INF/lib/customer_classes_14586.jar
这意味着对JAXBContext
在 JAX-WS 部署期间创建。
有可能吗?
特定于服务器的解决方案很好(带有 Metro ws 堆栈的 glassfish 3.1)
UPDATE
我错过了一件可能很重要的事情:我在运行时通过 Web 管理控制台将这些 Web 服务部署为 OSGI 捆绑包。当我按下部署按钮时,新的 jar 会以编程方式从客户库、Web 服务类构建,wsdl并体现出来。因此,如果有帮助的话,我可以干预构建过程并在此时提供提示信息。
第一个选项是@UsesJAXBContext
注解。更多信息请点击这里:在 SLSB 和 JAX-WS 中指定 JAXB 包 https://stackoverflow.com/questions/5627173/specify-jaxb-packages-in-slsb-and-jax-ws/5719285#5719285
我还没有测试过它,因为当我发现这个注释时,我已经转向其他可能对其他人有帮助的解决方案了。
关键是用@WebServiceProvider
代替@WebService
,有点低级但简单:
@WebServiceProvider(
wsdlLocation = "WEB-INF/wsdl/injector.wsdl"
)
@ServiceMode(value = Service.Mode.PAYLOAD)
public class InjectorService implements Provider<Source> {
private Unmarshaller unmarshaller;
@Override
public Source invoke(Source request) {
try {
DOMResult requestDom = new DOMResult();
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(request, requestDom);
Node requestNode = requestDom.getNode();
// Get the operation name node.
Node operationNode = requestNode.getFirstChild();
// Get the parameter node.
Node parameterNode = operationNode.getFirstChild();
// Unmarshal
JAXBElement<Object> element = unmarshaller.unmarshal(parameterNode, Object.class);
Object unmarshalled = element.getValue();
// Handling customer object and response ......
} catch (Exception e) {
throw new RuntimeException("Endpoint error", e);
}
}
protected Class[] getCustomerClasses() {
// return customer classes somehow
}
@PostConstruct
public void init() throws Exception {
JAXBContext jbc = JAXBContext.newInstance(getCustomerClasses());
unmarshaller = jbc.createUnmarshaller();
}
}
就是这样。客户类可以从类路径、捆绑上下文等获取。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)