我意识到它有点不RESTful,但我想使用Jersey客户端将一个Spring Integration GenericMessage
发送到使用Java序列化作为“编组”的Jersey服务器。是否有内置或贡献支持,或者我是否必须自己编写MessageBodyReader / Writer?我对setting the type in the Client request和"application/x-java-serialized-object"都进行了MediaType.APPLICATION_OCTET_STREAM_TYPE
尝试,它只是给出了通常情况:
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
谷歌和Jersey User Guide在这个问题上都很奇怪。我还接受另一种允许向Jersey API发送任意GenericMessage
的方法。我不一定要进行序列化。它似乎是处理具有任意有效载荷类型的消息的最简单路由。
答案 0 :(得分: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);
}
}