Использование Moxy с Metro в Tomcat

из-за требований компании мы не можем использовать Glassfish в качестве сервера приложений. Тем не менее я бы хотел использовать Moxy. Поэтому я попытался получить новую версию Metro (2_jaxb_2" rel="nofollow noreferrer">https://blogs.oracle.com/mgrebac / entry / metro

@WebService
public class TestService {
    public String sayHello() throws JAXBException {
        System.out.println(org.eclipse.persistence.Version.getVersion());
        JAXBContext c = JAXBContext.newInstance(TestPojo.class);
        return "Hello";
    }
}
2_jaxb_2) для работы с tomcat 7. Мне удалось запустить Moxy с помощью Spring, как описано в документации по метро (http://metro.java.net/guide/user-guide.html#springa), но мне не удалось заставить его работать с Moxy.

Я пробовал решение, упомянутое в документации по метро (http://metro.java.net/2.2/guide/ch17.html) и решение, упомянутое здесь (Используйте Moxy как реализацию JAXB по умолчанию).

Но максимум, что я мог извлечь из этого, было следующее исключение:

com.sun.xml.ws.spi.db.DatabindingException: Unknown JAXBContext implementation: class org.eclipse.persistence.jaxb.JAXBContext
    at com.sun.xml.ws.spi.db.BindingContextFactory.getJAXBFactory(BindingContextFactory.java:207)
    at com.sun.xml.ws.spi.db.BindingContextFactory.create(BindingContextFactory.java:149)
    at com.sun.xml.ws.message.jaxb.JAXBMessage.create(JAXBMessage.java:160)
    at com.sun.xml.ws.fault.SOAPFaultBuilder.createSOAP11Fault(SOAPFaultBuilder.java:423)
    at com.sun.xml.ws.fault.SOAPFaultBuilder.createSOAPFaultMessage(SOAPFaultBuilder.java:200)
    at com.sun.xml.ws.fault.SOAPFaultBuilder.createSOAPFaultMessage(SOAPFaultBuilder.java:188)
    at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:391)
    at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:640)
    at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:263)
    at com.sun.xml.ws.transport.http.servlet.ServletAdapter.invokeAsync(ServletAdapter.java:218)
    at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doGet(WSServletDelegate.java:159)
    at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost(WSServletDelegate.java:194)
    at com.sun.xml.ws.transport.http.servlet.WSSpringServlet.doPost(WSSpringServlet.java:52)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

Мой тестовый веб-сервис был:

@WebService
public class TestService {
    public String sayHello() throws JAXBException {
        System.out.println(org.eclipse.persistence.Version.getVersion());
        JAXBContext c = JAXBContext.newInstance(TestPojo.class);
        return "Hello";
    }
}

И да, баночки moxy (org.eclipse.persistence.moxy-2.4.0.jar, org.eclipse.persistence.core-2.4.0.jar, org.eclipse.persistence.asm-3.3.1.v201206041142.jar ) находятся в пути к классам.

Спасибо за помощь

JayBee


person JayBee    schedule 18.02.2013    source источник
comment
Возникла та же проблема, вы нашли решение?   -  person JavaDev    schedule 28.06.2016


Ответы (1)


Вы всегда можете использовать механизм JAX-WS Provider для использования EclipseLink JAXB (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);
        }
    }

}

Для получения дополнительной информации

person bdoughan    schedule 18.02.2013
comment
Привет, спасибо за ответ. Но мне кажется, что это очень низкоуровневый подход, когда мне приходится многое делать вручную. Вероятно, есть ответ на простой вопрос, почему JAXBContext.newInstance уже знает, что у нас есть org.eclipse.persistence.jaxb.JAXBContext, но затем не может найти нужный фабрика ? - person JayBee; 19.02.2013