2013-02-25 4 views
1

Я понимаю, что это немного не-RESTful, но я бы хотел использовать клиент Джерси, чтобы отправить интеграцию с весной GenericMessage на сервер Джерси, используя сериализацию Java в качестве «сортировки». Есть ли встроенная поддержка или вклад для этого, или мне придется написать свой собственный MessageBodyReader/Writer? Я попытался setting the type in the Client request как к "application/x-java-serialized-object" и MediaType.APPLICATION_OCTET_STREAM_TYPE, и он просто дает обычный:Как заставить Джерси использовать сериализацию Java?

ClientHandlerException: A message body writer for Java type, 
    class org.springframework.integration.message.GenericMessage, 
    and MIME media type, application/x-java-serialized-object, was not found 

Оба Google и Jersey User Guide странное молчание по этому вопросу. Я также принимаю альтернативный способ разрешить отправку произвольного GenericMessage на Джерси-API. Я не обязательно устанавливаю сериализацию. Это просто самый простой способ обработки сообщений с произвольными типами полезных нагрузок.

ответ

3

я до сих пор не нашел ни одного, и, видимо, никто не знает одного либо, так что я написал свою собственную быструю реализацию с использованием Commons Lang's SerializationUtils делать грязную работу за меня:

import org.apache.commons.lang.SerializationUtils; 
import org.springframework.stereotype.Component; 

import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.MultivaluedMap; 
import javax.ws.rs.ext.MessageBodyReader; 
import javax.ws.rs.ext.MessageBodyWriter; 
import javax.ws.rs.ext.Provider; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.Serializable; 
import java.lang.annotation.Annotation; 
import java.lang.reflect.Type; 

/** 
* Created with IntelliJ IDEA. 
* User: ryan 
* Date: 2/25/13 
* Time: 2:07 PM 
*/ 
@Component 
@Provider 
public class SerializationMessageBodyReaderAndWriter 
     implements MessageBodyReader<Serializable>, MessageBodyWriter<Serializable> { 
    public static final String APPLICATION_JAVA_SERIALIZED_OBJECT = 
      "application/x-java-serialized-object"; 
    public static final MediaType APPLICATION_JAVA_SERIALIZED_OBJECT_TYPE = 
      MediaType.valueOf(APPLICATION_JAVA_SERIALIZED_OBJECT); 

    @Override 
    public boolean isReadable(Class<?> type, 
           Type genericType, 
           Annotation[] annotations, 
           MediaType mediaType) { 
     return mediaType.isCompatible(APPLICATION_JAVA_SERIALIZED_OBJECT_TYPE) 
       && Serializable.class.isAssignableFrom(type); 
    } 

    @Override 
    public Serializable readFrom(Class<Serializable> type, 
           Type genericType, 
           Annotation[] annotations, 
           MediaType mediaType, 
           MultivaluedMap<String, String> httpHeaders, 
           InputStream entityStream) { 
     return (Serializable) SerializationUtils.deserialize(entityStream); 
    } 

    @Override 
    public boolean isWriteable(Class<?> type, 
           Type genericType, 
           Annotation[] annotations, 
           MediaType mediaType) { 
     return mediaType.isCompatible(APPLICATION_JAVA_SERIALIZED_OBJECT_TYPE) 
       && Serializable.class.isAssignableFrom(type); 
    } 

    @Override 
    public long getSize(Serializable o, 
         Class<?> type, 
         Type genericType, 
         Annotation[] annotations, 
         MediaType mediaType) { 
     return -1; 
    } 

    @Override 
    public void writeTo(Serializable o, 
         Class<?> type, 
         Type genericType, 
         Annotation[] annotations, 
         MediaType mediaType, 
         MultivaluedMap<String, Object> httpHeaders, 
         OutputStream entityStream) { 
     SerializationUtils.serialize(o, entityStream); 
    } 
} 
Смежные вопросы