2

少しRESTfulではないことはわかっていますが、Jerseyクライアントを使用して、GenericMessageJavaシリアライゼーションを「マーシャリング」として使用して、Spring IntegrationをJerseyサーバーに送信したいと考えています。そのための組み込みまたは contrib サポートはありますか、または独自のMessageBodyReader / Writerを作成する必要がありますか? クライアントリクエストのタイプを「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

Google もJersey User Guideも、この件に関して奇妙なことに沈黙しています。また、任意GenericMessageのものをJersey APIに送信できるようにする別の方法も受け入れます。私は必ずしも連載に設定されているわけではありません。任意のペイロード タイプのメッセージを処理するための最も簡単な方法のように思えます。

4

1 に答える 1

3

私はまだそれを見つけていませんし、どうやら他の誰もそれを知らないようです.

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);
    }
}
于 2013-02-25T21:39:29.080 に答える