JAXRS / CXF, почему этот простой пост-пример не работает - PullRequest
2 голосов
/ 16 марта 2012

Я знаю, что мой клиент работает, когда я публикую на другом сайте, и все это работает.Я изменил клиента для отправки на URL http://localhost:9000/enrollment/enroll и запустил следующий сервер ...

@Path("/enrollment")
public class MockHpsRestApi {

    private static final Logger log = LoggerFactory.getLogger(MockHpsRestApi.class);

    public static void main(final String[] args) throws InterruptedException,
            IOException, MuleException {
        log.info("starting the server");
        JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
        sf.setResourceClasses(MockHpsRestApi.class);
        sf.setResourceProvider(MockHpsRestApi.class, new SingletonResourceProvider(new MockHpsRestApi()));

        sf.setAddress("http://0.0.0.0:9000/");

        sf.create();
    }

    @POST
    @Path("/enroll")
    @Consumes("application/xml")
    public String enrollment(MultipartBody body) throws IOException {
        log.info("received request="+body);
        Attachment att = body.getRootAttachment();
        ByteArrayOutputStream str = new ByteArrayOutputStream(100);
        InputStream in = att.getDataHandler().getInputStream();
        try {
            IOUtils.copy(in, str);

            log.info("body payload received="+str);
            String xml = "success";
            return xml;
        } finally {
            IOUtils.closeQuietly(in);
            IOUtils.closeQuietly(str);
        }
    }
}

Мои журналы, хотя и говорят об этом, когда он получает запрос ...

2012-03-16 09:30:30,295 INFO 300 [main] c.i.e.s.i.MockHpsRestApi - starting the server 
Mar 16, 2012 9:30:30 AM org.apache.cxf.endpoint.ServerImpl initDestination
INFO: Setting the server's publish address to be http://0.0.0.0:9000/
2012-03-16 09:30:30,769 INFO 774 [main] org.eclipse.jetty.server.Server - jetty-7.5.4.v20111024 
2012-03-16 09:30:30,801 INFO 806 [main] o.e.jetty.server.AbstractConnector - Started SelectChannelConnector@0.0.0.0:9000 STARTING 
2012-03-16 09:30:30,824 INFO 829 [main] o.e.j.server.handler.ContextHandler - started o.e.j.s.h.ContextHandler{,null} 
Mar 16, 2012 9:30:37 AM org.apache.cxf.jaxrs.utils.JAXRSUtils readFromMessageBody
WARNING: No message body reader has been found for request class MultipartBody, ContentType : application/xml.
Mar 16, 2012 9:30:37 AM org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper toResponse
WARNING: WebApplicationException has been caught : no cause is available

Почему это не работает?

Хммм, поднимая уровни логов, это какая-то ошибка в CXF, хотя это будет означать, что никто на самом деле не делает базовые сообщения, так что это некажется правильным .... (опять же, мой клиент отправляет нормально другой службе сегодня).

2012-03-16 09:51:01,414 DEBUG 10916 [qtp669588045-18 - /enrollment/enroll] o.a.c.j.i.JAXRSInInterceptor - Request path is: /enrollment/enroll 
2012-03-16 09:51:01,414 DEBUG 10916 [qtp669588045-18 - /enrollment/enroll] o.a.c.j.i.JAXRSInInterceptor - Request HTTP method is: POST 
2012-03-16 09:51:01,414 DEBUG 10916 [qtp669588045-18 - /enrollment/enroll] o.a.c.j.i.JAXRSInInterceptor - Request contentType is: application/xml 
2012-03-16 09:51:01,415 DEBUG 10917 [qtp669588045-18 - /enrollment/enroll] o.a.c.j.i.JAXRSInInterceptor - Accept contentType is: */* 
2012-03-16 09:51:01,415 DEBUG 10917 [qtp669588045-18 - /enrollment/enroll] o.a.c.j.i.JAXRSInInterceptor - Found operation: enrollment 
2012-03-16 09:51:01,420 WARN 10922 [qtp669588045-18 - /enrollment/enroll] o.apache.cxf.jaxrs.utils.JAXRSUtils - No message body reader has been found for request class MultipartBody, ContentType : application/xml. 
2012-03-16 09:51:01,423 WARN 10925 [qtp669588045-18 - /enrollment/enroll] o.a.c.j.i.WebApplicationExceptionMapper - WebApplicationException has been caught : no cause is available 
2012-03-16 09:51:01,428 DEBUG 10930 [qtp669588045-18 - /enrollment/enroll] o.a.c.j.i.WebApplicationExceptionMapper - no cause is available 
javax.ws.rs.WebApplicationException: null
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1052) ~[cxf-bundle-2.5.2.jar:2.5.2]
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:616) ~[cxf-bundle-2.5.2.jar:2.5.2]
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:580) ~[cxf-bundle-2.5.2.jar:2.5.2]
    at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:238) ~[cxf-bundle-2.5.2.jar:2.5.2]
    at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:89) ~[cxf-bundle-2.5.2.jar:2.5.2]
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263) [cxf-api-2.5.2.jar:2.5.2]
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:123) [cxf-rt-core-2.5.2.jar:2.5.2]
    at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:323) [cxf-bundle-2.5.2.jar:2.5.2]
    at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:289) [cxf-bundle-2.5.2.jar:2.5.2]
    at org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:72) [cxf-bundle-2.5.2.jar:2.5.2]
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:943) [jetty-server-7.5.4.v20111024.jar:7.5.4.v20111024]
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:879) [jetty-server-7.5.4.v20111024.jar:7.5.4.v20111024]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) [jetty-server-7.5.4.v20111024.jar:7.5.4.v20111024]

Ответы [ 2 ]

1 голос
/ 17 марта 2012

После отладки кода оказывается, что вы можете использовать следующие типы в качестве параметров для вышеуказанного метода:

  • Source
  • XMLSource
  • Document
  • byte[]
  • InputStream

В итоге я использовал InputStream.

1 голос
/ 16 марта 2012

При использовании @POST и @Consumes("application/xml") для аргумента (одиночного без аннотирования) в методе обычно является JAXB-аннотированный класс, в который CXF десериализует XML, прежде чем передать его вам. Есть ли какая-то особая причина для того, чтобы не следовать этому хорошо пройденному маршруту?

...