当前位置: 首页 > 知识库问答 >
问题:

如何在基于JAX-WS的web服务中使EclipseLink MOXy在WebLogic中工作?

陆雨华
2023-03-14

我想使用WebLogic10.3.6.0中的EclipseLink来托管使用JAX-WS的Web服务。这在Tomcat中工作得很好。

  • Java 1.6
  • WebLogic 10.3.6.0
  • Eclipselink 2.4.0.V20120608-R11652
  • JAXWS 2.2.7-20120813

WEB-INF/lib包含:

  • eclipselink.jar
  • fastInfoset.jar
  • gmbal-api-only.jar
  • ha-api.jar
  • javax.annotation.jar
  • jaxb-api.jar
  • jaxb-impl.jar
  • jaxb-xjc.jar
  • jaxws-api.jar
  • jaxws-eclipselink-plugin.jar
  • jaxws-rt.jar
  • jaxws-tools.jar
  • jsr181-api.jar
  • mail.jar
  • 管理-api.jar
  • mimepull.jar
  • policy.jar
  • saaj-api.jar
  • saaj-impl.jar
  • stax-ex.jar
  • stax2-api.jar
  • streambuffer.jar
  • woodstox-core-asl.jar
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "test_request")
public class TestRequestDTO implements Serializable {
    @XmlPath("request/name/text()")
    private String requestName;
    @XmlPath("request/value/text()")
    private String requestValue;
    //getter setters
}

TestResponseDTo.java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "test_response")
public class TestResponseDTO implements Serializable {
    @XmlPath("response/name/text()")
    private String responseName;
    @XmlPath("response/value/text()")
    private String responseValue;
    //getter setters
}

服务:sampletest.java

@WebService
public class SampleTest {
    @WebMethod
    public TestResponseDTO fetchResponse(TestRequestDTO request) {
        System.out.println("request.getRequestName()" + request.getRequestName());
        System.out.println("request.getRequestValue()" + request.getRequestValue());
        TestResponseDTO response = new TestResponseDTO();
        response.html" target="_blank">setResponseName("Service Response");
        response.setResponseValue(new Date().toString());
        return response;
    }
}

Tomcat中的完美XML:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://service.test.services.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <q0:fetchResponse>
            <arg0>
                <request>
                    <name>this-that</name> 
                    <value>home-run</value> 
                </request>
            </arg0>
        </q0:fetchResponse>
    </soapenv:Body>
</soapenv:Envelope>

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns0:fetchResponseResponse xmlns:ns0="http://service.test.services.com/">
            <return>
                <response>
                    <name>Service Response</name> 
                    <value>Wed Feb 06 20:21:13 XXX 2013</value> 
                </response>
            </return>
        </ns0:fetchResponseResponse>
    </S:Body>
</S:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://service.test.services.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <q0:fetchResponse>
            <arg0>
                <requestName>hello</requestName> 
                <requestValue>wassup</requestValue> 
            </arg0>
        </q0:fetchResponse>
    </soapenv:Body>
</soapenv:Envelope>

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns2:fetchResponseResponse xmlns:ns2="http://service.test.services.com/">
            <return>
                <responseName>Service Response</responseName> 
                <responseValue>Wed Feb 06 20:30:06 IST 2013</responseValue> 
            </return>
        </ns2:fetchResponseResponse>
    </S:Body>
</S:Envelope>

共有1个答案

谷飞星
2023-03-14

WebLogic10.3.6中的JAX-WS实现是硬编码的,以使用JAXB参考实现。EclipseLink JAXB(MOXy)是WebLogic 12.1.1的默认JAXB提供程序,您可以在JAX-WS Web服务中利用我们的所有扩展:

  • http://blog.bdoughan.com/2011/12/eclipselink-moxy-is-jaxb-provider-in.html

对于不提供与MOXy作为JAXB提供者的集成的JAX-WS实现,您可以使用javax.xml.ws.provider接口来代替传统的服务endpoint接口。Provider允许您访问实际的XML消息。通过访问XML消息,您可以直接使用MOXY与它进行交互。

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);
        }
    }

    @Override
    public 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);
        }
    }

}

有关更多信息

  • http://blog.bdoughan.com/2013/02/leveraging-moxy-in-your-web-service-via.html
  • 如何在web服务中使用Moxy XPath注释bean?
 类似资料:
  • 如前一个StackOverflow问题所述,我正在学习如何使用JAX-WS(用于XML Web服务的Java API)。我在以前的可执行Java程序中使用过Log4j2,我想用它来记录web服务请求。在本JAX-WS教程中,如何将Log4j2添加到基本代码中?

  • 你好,我曾与JAX-WS合作开发基于SOAP的网络服务。现在我想使用REST,因为正如我从这里学习的那样,REST比SOAP有优势。 但从不同的文章中,我知道我们也可以从JAX-WS创建RESTful Web服务。但是大多数人说我们应该使用JAX-RS而不是JAX-WS。 我的问题是JAX-WS RESTful webservice和JAX-RS(泽西)之间有什么区别。JAX-RS相对于JAX-W

  • 问题内容: 我想通过将其存储为Servlet上下文属性来在Servlet和Web服务(JAX-WS)之间共享一个对象。但是,如何从Web服务检索servlet上下文? 问题答案: JAX-WS通过消息上下文使servlet上下文可用,可以使用Web服务上下文来检索它。插入以下成员将使JAX- WS将对Web服务上下文的引用注入到您的Web服务中: 然后,您可以使用以下命令访问servlet上下文:

  • 我有 Windows Server 2012 R2上的WebSphere Liberty 17.0.0.1“base_ilan”x86_64 Windows 10 x86_64上的Eclipse Neon.3(同一LAN上的独立服务器) Oracle Java JDK 1.8.0_121running Liberty 运行Eclipse的IBM JDK 8(来自Eclipse包)(需要它来支持Wi

  • 问题内容: 如何在JAX-WS Web服务上引发自定义的肥皂错误?我怎么可以指定,和SOAP错误的?是否可以设置as bean而不是a的值? 请注意,我正在使用代码优先方法进行开发。 问题答案: 使用注释。 您可以在Java JAX-WS Web服务 中的使用SOAP错误和异常-Java上的Eben Hewitt中看到一个很好的示例。 您将看到示例: 更新 另一种方法是在子句中声明 典型的 异常。

  • 我在weblogic 10.3.6中用JAX-WS实现了一个到不同类型Web服务的连接器,该连接器可以配置为2waySSL和代理,并将两者结合起来。 > 使用代理的实现使用ClientProxyFeature正常工作。 与使用自定义SSLSocketFactory的2waySSL相同,Oracle在留档中说。通过SSL保持请求的状态(仅限JAX-WS) 当组合这两个功能时会出现问题。握手没有发生(