2010-07-06 7 views
1

Помощь! Попытка реализовать протокольные буферы через Rest (Jersey), но получить это исключение.Ошибка протокола MIME

class com.util.ProtobufMessageBodyReader 
class com.util.ProtobufMessageBodyWriter 
Jul 6, 2010 3:43:37 PM org.apache.coyote.http11.Http11Protocol start 
INFO: Starting Coyote HTTP/1.1 on http-9102 
Jul 6, 2010 3:43:37 PM org.apache.catalina.startup.Catalina start 
INFO: Server startup in 45485 ms 
Jul 6, 2010 3:49:00 PM org.apache.catalina.connector.CoyoteAdapter convertURI 
SEVERE: Invalid URI encoding; using HTTP default 
Jul 6, 2010 3:49:00 PM com.sun.jersey.spi.container.ContainerRequest getEntity 
SEVERE: A message body reader for Java type, class com.example.tutorial.ProfileRequestProto$ProfileRequest, and MIME media type, application/x-protobuf, was not found 

Я загрузил ProtobufMessageBodyReader/записи в Apache ContextLoader. Из журнала выше, кажется Tomcat найден класс, но очевидно, что терпит неудачу, когда он читает

@Consumes("application/x-protobuf") 

Вот ProtobufMessageBodyReader

@Provider 
@Component 
@Consumes("application/x-protobuf") 
    public class ProtobufMessageBodyReader implements MessageBodyReader<Message> { 

    public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { 
     return Message.class.isAssignableFrom(type); 
    } 

    public Message readFrom(Class<Message> type, Type genericType, Annotation[] annotations, 
       MediaType mediaType, MultivaluedMap<String, String> httpHeaders, 
       InputStream entityStream) throws IOException, WebApplicationException { 
     try { 
      Method newBuilder = type.getMethod("newBuilder"); 
      GeneratedMessage.Builder<?> builder = (GeneratedMessage.Builder<?>) newBuilder.invoke(type); 
      return builder.mergeFrom(entityStream).build(); 
     } catch (Exception e) { 
      throw new WebApplicationException(e); 
     } 
    } 

    @Override 
    public boolean isReadable(Class<?> arg0, Type arg1, Annotation[] arg2) { 
    // TODO Auto-generated method stub 
    return false; 
    } 

А вот ProtobufMessageBodyWriter

@Provider 
@Component 
@Produces("application/x-protobuf") 
public class ProtobufMessageBodyWriter implements MessageBodyWriter<Message> { 

    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { 
     return Message.class.isAssignableFrom(type); 
    } 

    public long getSize(Message m, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { 
     return m.getSerializedSize(); 
    } 

    public void writeTo(Message m, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String,Object> httpHeaders,OutputStream entityStream) throws IOException, WebApplicationException { 
     entityStream.write(m.toByteArray()); 
    } 

Вот код от клиента:

URL url = new URL(URL); 
    HttpURLConnection http = (HttpURLConnection)url.openConnection(); 
    http.setDoInput(true); 
    http.setDoOutput(true); 
    http.setUseCaches(false); 
     http.setRequestMethod("POST"); 
     http.setRequestProperty("Content-Type","application/x-protobuf"); 
     http.setRequestProperty("Accept", "application/x-protobuf"); 

     DataOutputStream stream = new DataOutputStream(http.getOutputStream()); 

     if(contentType.equals("application/x-protobuf")) { 
      ProfileRequest.Builder profile = ProfileRequest.newBuilder(); 
      profile.setName("John"); 
      profile.setId("123"); 
      profile.build().writeTo(http.getOutputStream()); 
     } 

     stream.flush(); 
     stream.close(); 

А вот код с сервера

@POST 
    @Consumes("application/x-protobuf") 
    public byte[] processProtoRequest(ProfileRequest protoRequest) { 

    byte[] result = null;  
    ProfileRequest.Builder profile = ProfileRequest.newBuilder(); 
    profile.mergeFrom(protoRequest);     
    result = getProfileProtoResponse(profile); 

     }catch(Exception e){ 
     } 

     return result; 
    } 

Я не могу понять, в чем проблема. Есть ли что-нибудь с конфигурацией Джерси? Или что-то не так, когда я отправил запрос протокола через HTTP?

Любая помощь будет оценена.

Благодаря

+0

установить тип контента в "application/octet-stream" http://stackoverflow.com/questions/1425912/google-protocol-buffers-and-http – fjjiaboming

ответ

2

Вы в основном прибили проблему самостоятельно я уже думаю:

и MIME тип носителя, применение/х-Protobuf, не был найден
[...]

Из журнала выше, кажется, что Tomcat нашел класс, но, похоже, он терпит неудачу, когда он читает @Consumes("application/x-protobuf")

Типы носителей, поддерживаемые Jersey (или, скорее, JSR-311/JAX-RS), изложены в class MediaType. Чтобы решить проблему, этого может быть достаточно, чтобы определить подходящий тип носителя для application/x-protobuf, см. Раздел [Jersey] MediaType-s? для обсуждения и примеров относительно этого.

0

Я только что встретил ту же проблему на моем проекте maven + jersey + protobuf, и я использую tomcat 6. Мне проблемы в том, что класс провайдера tomcat не нашел. После того как я решить эту проблему кот 6.0 показывает, как это:

Deploying configuration descriptor jerseydemo2.xml 
一月 26, 2015 11:13:41 上午 com.sun.jersey.api.core.WebAppResourceConfig init 
信息: Scanning for root resource and provider classes in the Web app resource paths: 
    /WEB-INF/lib 
    /WEB-INF/classes 
一月 26, 2015 11:13:41 上午 com.sun.jersey.api.core.ScanningResourceConfig logClasses 
信息: Root resource classes found: 
    class sample.hello.resources.AddressBookResource 
一月 26, 2015 11:13:41 上午 com.sun.jersey.api.core.ScanningResourceConfig logClasses 
信息: Provider classes found: 
    class sample.pb.ProtobufMessageBodyReader 
    class sample.pb.ProtobufMessageBodyWriter 
一月 26, 2015 11:13:41 上午 com.sun.jersey.server.impl.application.WebApplicationImpl initiate 
信息: Initiating Jersey application, version 'Jersey: 1.2-SNAPSHOT 01/27/2010 01:47 AM' 

до того, как показал классы провайдера не найдено.

мои проблемы в том, что файл web.xml установил конкретный путь для tomcat, чтобы найти все resouces. теперь я изменил это следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5"> 
    <servlet> 
     <servlet-name>ServletAdaptor</servlet-name> 
     <servlet-class>com.sun.jersey.server.impl.container.servlet.ServletAdaptor</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>ServletAdaptor</servlet-name> 
     <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 

</web-app> 

надеюсь, что это поможет!

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

  • Нет связанных вопросов^_^