jax-rs jax-ws_通过JAX-WS Provider在Web服务中利用MOXy
jax-rs jax-ws
在以前的文章中,我演示了如何將EclipseLink JAXB(MOXy)直接集成到WebLogic(從12.1.1開始)和GlassFish(從3.1.2開始)的JAX-WS實現中 。 在本文中,我將演示如何通過使用JAX-WS Provider類在任何應用程序服務器中利用MOXy。
網絡服務
JAX-WS中的提供者機制為您提供了一種創建可直接訪問XML的Web服務的方法。 通過@ServiceMode批注,您可以指定是要從消息中獲取所有XML還是僅是負載。
FindCustomerService
所有的魔術都發生在invoke方法中。 由于我們將PAYLOAD指定為服務模式,因此輸入將是表示消息正文的Source實例。 所有JAXB(JSR-222)實現都可以從Source解組,因此我們將這樣做以實現請求。 在執行業務邏輯之后,我們需要將響應的正文作為Source的實例返回。 為此,我們將響應對象包裝在JAXBSource的實例中。
package blog.jaxws.provider;import javax.xml.bind.*; import javax.xml.bind.util.JAXBSource; import javax.xml.transform.Source; import javax.xml.ws.*;@ServiceMode(Service.Mode.PAYLOAD) @WebServiceProvider(portName = 'FindCustomerPort', serviceName = 'FindCustomerService', targetNamespace = 'http://service.jaxws.blog/', wsdlLocation = 'WEB-INF/wsdl/FindCustomerService.wsdl') public class FindCustomerService implements Provider<Source> {private JAXBContext jaxbContext;public FindCustomerService() {try {jaxbContext = JAXBContext.newInstance(FindCustomerResponse.class,FindCustomerRequest.class);} catch (JAXBException e) {throw new WebServiceException(e);}}@Overridepublic Source invoke(Source request) throws WebServiceException {try {Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();FindCustomerRequest fcRequest = (FindCustomerRequest) unmarshaller.unmarshal(request);Customer customer = new Customer();customer.setId(fcRequest.getArg0());customer.setFirstName('Jane');customer.setLastName('Doe');FindCustomerResponse response = new FindCustomerResponse();response.setValue(customer);return new JAXBSource(jaxbContext, response);} catch (JAXBException e) {throw new WebServiceException(e);}}}MOXy作為JAXB提供者
要指定將MOXy用作JAXB提供程序,我們需要包含一個名為jaxb.properties的文件,該文件與我們的域模型位于同一包中,并帶有以下條目(請參閱:將EclipseLink MOXy指定為JAXB Provider )。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactoryWSDL
以下是與我們的Web服務相對應的WSDL。 使用Provider方法的一個缺點是 JAX-WS實現無法自動為我們生成一個(請參閱: GlassFish 3.1.2充滿了MOXy(EclipseLink JAXB) )。 WSDL是必需的,因為它為客戶端定義了合同。 它甚至可以用于生成客戶端。
<?xml version='1.0' encoding='UTF-8'?> <definitions xmlns:wsu='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd' xmlns:wsp='http://www.w3.org/ns/ws-policy' xmlns:wsp1_2='http://schemas.xmlsoap.org/ws/2004/09/policy' xmlns:wsam='http://www.w3.org/2007/05/addressing/metadata' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:tns='http://service.jaxws.blog/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns='http://schemas.xmlsoap.org/wsdl/' targetNamespace='http://service.jaxws.blog/' name='FindCustomerService'><types><xsd:schema><xsd:import namespace='http://service.jaxws.blog/' schemaLocation='FindCustomerService.xsd'/></xsd:schema></types><message name='findCustomer'><part name='parameters' element='tns:findCustomer'/></message><message name='findCustomerResponse'><part name='parameters' element='tns:findCustomerResponse'/></message><portType name='FindCustomer'><operation name='findCustomer'><input wsam:Action='http://service.jaxws.blog/FindCustomer/findCustomerRequest' message='tns:findCustomer'/><output wsam:Action='http://service.jaxws.blog/FindCustomer/findCustomerResponse' message='tns:findCustomerResponse'/></operation></portType><binding name='FindCustomerPortBinding' type='tns:FindCustomer'><soap:binding transport='http://schemas.xmlsoap.org/soap/http' style='document'/><operation name='findCustomer'><soap:operation soapAction=''/><input><soap:body use='literal'/></input><output><soap:body use='literal'/></output></operation></binding><service name='FindCustomerService'><port name='FindCustomerPort' binding='tns:FindCustomerPortBinding'><soap:address location='http://localhost:8080/Blog-JAXWS/FindCustomerService'/></port></service> </definitions>XML模式
下面是對應于我們的消息有效負載的XML模式。 使用Provider方法的一個缺點是JAX-WS實現不能直接利用JAXB直接直接自動生成XML模式,因此我們需要提供一個。
<?xml version='1.0' encoding='UTF-8'?> <xsd:schema xmlns:ns0='http://service.jaxws.blog/' xmlns:xsd='http://www.w3.org/2001/XMLSchema'targetNamespace='http://service.jaxws.blog/'><xsd:element name='findCustomerResponse' type='ns0:findCustomerResponse' /><xsd:complexType name='findCustomerResponse'><xsd:sequence><xsd:element name='return' type='ns0:customer'minOccurs='0' /></xsd:sequence></xsd:complexType><xsd:element name='findCustomer' type='ns0:findCustomer' /><xsd:complexType name='findCustomer'><xsd:sequence><xsd:element name='arg0' type='xsd:int' /></xsd:sequence></xsd:complexType><xsd:complexType name='customer'><xsd:sequence><xsd:element name='personal-info' minOccurs='0'><xsd:complexType><xsd:sequence><xsd:element name='first-name' type='xsd:string'minOccurs='0' /><xsd:element name='last-name'type='xsd:string'minOccurs='0' /></xsd:sequence></xsd:complexType></xsd:element></xsd:sequence><xsd:attribute name='id' type='xsd:int' use='required' /></xsd:complexType> </xsd:schema>請求對象
下面XML消息中突出顯示的部分是我們將在Source中作為實例在Provider中接收的內容。 我們將創建一個JAXB模型來映射到此部分。
<?xml version='1.0' encoding='UTF-8'?> <S:Envelope xmlns:S='http://schemas.xmlsoap.org/soap/envelope/'><S:Header/><S:Body><ns2:findCustomer xmlns:ns2='http://service.jaxws.blog/'><arg0>123</arg0></ns2:findCustomer></S:Body> </S:Envelope>FindCustomerRequest
根元素與主體的其余部分位于不同的XML名稱空間中。 我們將利用@XmlRootElement批注指定名稱空間(請參閱: JAXB&Namespaces )。
package blog.jaxws.provider;import javax.xml.bind.annotation.*;@XmlRootElement(namespace='http://service.jaxws.blog/', name='findCustomer') public class FindCustomerRequest {private int arg0;public int getArg0() {return arg0;}public void setArg0(int arg0) {this.arg0 = arg0;}}響應對象
下面XML消息中突出顯示的部分是作為Source實例,我們將從Provider返回的內容。 我們將創建一個JAXB模型來映射到此部分。
<S:Envelope xmlns:S='http://schemas.xmlsoap.org/soap/envelope/'><S:Header /><S:Body><ns0:findCustomerResponse xmlns:ns0='http://service.jaxws.blog/'><return id='123'><personal-info><first-name>Jane</first-name><last-name>Doe</last-name></personal-info></return></ns0:findCustomerResponse></S:Body> </S:Envelope>FindCustomerResponse
package blog.jaxws.provider;import javax.xml.bind.annotation.*;@XmlRootElement(namespace='http://service.jaxws.blog/') public class FindCustomerResponse {private Customer value;@XmlElement(name='return')public Customer getValue() {return value;}public void setValue(Customer value) {this.value = value;}}顧客
使用MOXy的眾多原因之一是其基于路徑的映射(請參閱: 基于XPath的映射 )。 以下是使用@XmlPath批注指定方式的示例 。
package blog.jaxws.provider;import javax.xml.bind.annotation.*; import org.eclipse.persistence.oxm.annotations.XmlPath;@XmlType(propOrder = { 'firstName', 'lastName' }) public class Customer {private int id;private String firstName;private String lastName;@XmlAttributepublic int getId() {return id;}public void setId(int id) {this.id = id;}@XmlPath('personal-info/first-name/text()')public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}@XmlPath('personal-info/last-name/text()')public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}}參考: Java XML和JSON綁定博客中的JCG合作伙伴 Blaise Doughan 通過JAX-WS Provider在Web服務中利用MOXy 。
翻譯自: https://www.javacodegeeks.com/2013/02/leveraging-moxy-in-your-web-service-via-jax-ws-provider.html
jax-rs jax-ws
總結
以上是生活随笔為你收集整理的jax-rs jax-ws_通过JAX-WS Provider在Web服务中利用MOXy的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 门轴总是响怎么办上油图解(房门铰链异响抹
- 下一篇: java的xml面试题_Java程序员的