7

Jacksonを使用してPOJOを逆シリアル化するクラスを作成しようとしています。

こんな感じ…

public class DeserialiserImp<T> implements Deserialiser<T> {

        protected ObjectMapper objectMapper = new ObjectMapper();

        @Override
        public T get(String content, Class clazz) throws IOException {
            return (T) objectMapper.readValue(content, clazz);
        }

        @Override
        public List<T> getList(String content, Class clazz) throws IOException {
            return objectMapper.readValue(content, TypeFactory.collectionType(ArrayList.class, clazz));
        }

    }

この実装について2つの質問があります。

1つ目は、クラス型をメソッドに渡して、オブジェクトマッパーが逆シリアル化する必要のある型を認識できるようにすることです。ジェネリックを使用するより良い方法はありますか?

また、getメソッドでは、objectMapperから返されたオブジェクトをTにキャストしています。ここでTをキャストする必要があり、それを呼び出すメソッドからオブジェクトタイプもキャストする必要があるため、これは特に厄介な方法のようです。

このプロジェクトではRoboguiceを使用しているので、インジェクションによってタイプを変更してから、返す必要のあるジェネリックタイプのオブジェクトに注釈を付けることができれば便利です。TypeLiteralについて読んで、この問題を解決できるかどうか疑問に思っていますか?

4

2 に答える 2

5

だから最後はわかったと思います。私がやっていることに何か問題がある場合は、コメントしてください。

インターフェイスは次のように定義されています...

public interface Deserialiser<T> {

    T get(String content) throws IOException;

    List<T> getList(String content) throws IOException;
}

インターフェースの実装はこんな感じ…

public class DeserialiserImp<T> implements Deserialiser<T> {

    private ObjectMapper objectMapper = new ObjectMapper();
    private final Class<T> klass;

    @Inject
    public DeserialiserImp(TypeLiteral<T> type){
        this.klass = (Class<T>) type.getRawType();
    }

    @Override
    public T get(String content) throws IOException {
        return objectMapper.readValue(content, klass);
    }

    @Override
    public List<T> getList(String content) throws IOException {
        return objectMapper.readValue(content, TypeFactory.collectionType(ArrayList.class, klass));
    }

}

私はそのように2をバインドします..

    bind(new TypeLiteral<Deserialiser<User>>(){}).annotatedWith(Names.named("user")).to(new TypeLiteral<DeserialiserImp<User>>(){});

あとはこれを使うだけ…

@Inject
@Named("user")
private Deserialiser<User> deserialiserImp;

public void test(String userString) {
    User user = deserialiserImp.get(UserString);
}

このパターンは、DAO オブジェクトで使用する抽象クラスとしてクラスを使用する場合にもうまく機能します。

この記事は私を助けました

于 2012-10-29T12:41:29.687 に答える