2016-04-19 1 views
0

Я пытаюсь сделать работу webservice с protobuf и json. Проблема заключается в том, что мне нужно иметь возможность читать входной поток для создания моего прото (по крайней мере, я не вижу другого способа сделать это).webservice обработка protobuf

Я создал конвертер для Protobuf:

public class ProtobufMessageConverter extends AbstractHttpMessageConverter<MyProto>{ 

    @Override 
    protected boolean supports(Class<?> aClass) { 
     return MyProto.class.equals(aClass); 
    } 

    @Override 
    protected MyProto readInternal(Class<? extends MyProto> aClass, HttpInputMessage httpInputMessage) 
      throws IOException, HttpMessageNotReadableException { 
     return MyProto.parseFrom(httpInputMessage.getBody()); 
    } 

    @Override 
    protected void writeInternal(MyProto proto, HttpOutputMessage httpOutputMessage) 
      throws IOException, HttpMessageNotWritableException { 
     OutputStream wr = httpOutputMessage.getBody(); 
     wr.write(proto.toByteArray()); 
     wr.close(); 
    } 
} 

используется в моем springconfiguration:

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = "com.test") 
public class SpringMvcConfiguration extends WebMvcConfigurationSupport { 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> httpMessageConverters) { 
     httpMessageConverters.add(new ProtobufMessageConverter(new MediaType("application","octet-stream"))); 

     addDefaultHttpMessageConverters(httpMessageConverters); 
    } 
} 

Мой контроллер:

@RequestMapping(value = "/proto", method = {POST}, consumes = {MediaType.APPLICATION_OCTET_STREAM_VALUE}) 
@ResponseBody 
public MyProto openProto(@RequestHeader(value = "Host") String host, @RequestBody 
    MyProto strBody, HttpServletRequest httpRequest 
) throws InterruptedException { 
    return null; 
} 

Проблема заключается в том, что если я позволяю контроллер как это, я получаю сообщение об ошибке, потому что мой веб-сервис не поддерживает приложение/октет-поток.

[главный] INFO org.eclipse.jetty.server.ServerConnector - Создана ServerConnector @ 73b05494 {HTTP/1.1} {0.0.0.0:8180} org.springframework.web.HttpMediaTypeNotSupportedException: Тип содержимого «приложение/octet- поток»не поддерживается на org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters (AbstractMessageConverterMethodArgumentResolver.java:155) ...

Если я ставлю строку в @RequestBody, то я иду в мой метод, но, похоже, он не использует конвертер, и строка не может быть передана в MyProto с помощью функции parseFrom.

У вас есть идеи?

ответ

0

Я нашел ответ на самом деле. Нам нужно рассмотреть protobuf как байт []. Для этого типа уже существует HttpMessageConverter. Следовательно, ResponseBody должен быть

public byte[] openProto(@RequestHeader(value = "Host") String host, @RequestBody 
    byte[] strBody, HttpServletRequest httpRequest 
) throws InterruptedException { 
    return null; 
}