2013-12-06 3 views
3

Я пишу службу REST с использованием JAX-RS 2.0, чтобы имитировать существующий HTTP-интерфейс.ручка POST без тела

Включает отправку пустого запроса по пути и последующее добавление содержимого POST на тот же Путь.

Сейчас мой сайт выглядит следующим образом:

@Path("data") 
public class MyResource { 
    @Inject 
    MyService service; 

    @POST 
    @Produces(MediaType.APPLICATION_OCTET_STREAM) 
    public byte[] init() { 
    return service.init(); 
    } 

    @POST 
    @Produces(MediaType.APPLICATION_OCTET_STREAM) 
    @Consumes(MediaType.APPLICATION_OCTET_STREAM) 
    public byte[] work(byte[] data) { 
    return service.work(data); 
    } 
} 

К сожалению, когда клиент пытается POST его инициализации, возникает следующая ошибка:

org.jboss.resteasy.spi.BadRequestException: content-type was null and expecting to extract a body into public javax.ws.rs.core.Response rest.MyResource.work(byte[]) 
     at org.jboss.resteasy.core.MessageBodyParameterInjector.inject(MessageBodyParameterInjector.java:131) 
     at org.jboss.resteasy.core.MethodInjectorImpl.injectArguments(MethodInjectorImpl.java:114) 
     at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:137) 
     at org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:252) 
     at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:217) 
     at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:206) 
     at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:514) 
     at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:491) 
     at org.jboss.resteasy.core.SynchronousDispatcher.invokePropagateNotFound(SynchronousDispatcher.java:140) 
     at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:204) 
     at org.jboss.resteasy.plugins.server.servlet.FilterDispatcher.doFilter(FilterDispatcher.java:59) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
     at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190) 
     at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92) 
     at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126) 
     at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
     at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330) 
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829) 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598) 
     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 
     at java.lang.Thread.run(Thread.java:662) 

Есть ли способ решить эту проблему с помощью JAX -RS или мне нужно вернуться к Servlets, чтобы справиться с этой конкретной ситуацией?

ответ

0

Я не могу воспроизвести эту проблему. Рассмотрим этот метод JAX-RS:

@POST 
@Path("/bytes") 
@Consumes(MediaType.APPLICATION_OCTET_STREAM) 
public Response postOctetStream(byte[] bytes) { 
    return Response.ok(bytes.length).build(); 
} 

Рассмотрим curl вызов:

$ curl -v -X POST -H "Content-Type: application/octet-stream" -d "" http://localhost:8080/WebApplication4/webresources/bytes 
* About to connect() to localhost port 8080 (#0) 
* Trying 127.0.0.1... 
* Connected to localhost (127.0.0.1) port 8080 (#0) 
> POST /WebApplication4/webresources/foo/bytes HTTP/1.1 
> User-Agent: curl/7.29.0 
> Host: localhost:8080 
> Accept: */* 
> Content-Type: application/octet-stream 
> Content-Length: 0 
> 
< HTTP/1.1 200 OK 
< X-Powered-By: Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition 4.0 Java/Oracle Corporation/1.7) 
< Server: GlassFish Server Open Source Edition 4.0 
< Content-Type: text/plain 
< Date: Mon, 09 Dec 2013 10:56:55 GMT 
< Content-Length: 1 
< 

Как вы можете видеть, клиент устанавливает Content-Length: 0. Сервер может сопоставить это пустое тело с нулевой длиной byte[].

Смежные вопросы