Reputation: 128869
I realize it's a little un-RESTful, but I'd like to use a Jersey client to send a Spring Integration GenericMessage
to a Jersey server using Java serialization as the "marshalling". Is there built-in or contrib support for that, or will I have to write my own MessageBodyReader/Writer? I've tried setting the type in the Client request to both "application/x-java-serialized-object" and MediaType.APPLICATION_OCTET_STREAM_TYPE
, and it just gives the usual:
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
Both Google and the Jersey User Guide are strangely silent on this subject. I'd also accept an alternate way to allow sending an arbitrary GenericMessage
to a Jersey API. I'm not necessarily set on serialization. It just seems the easiest route for handling messages with arbitrary payload types.
Upvotes: 2
Views: 2130
Reputation: 128869
I still haven't found one, and apparently nobody else knows of one either, so I wrote my own quick implementation using Commons Lang's SerializationUtils to do the dirty work for me:
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);
}
}
Upvotes: 3