我试图让使用杰克逊反序列化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个问题。
第一个是我传递类的类型为方法,使得objectmapper知道应该反序列化的类型。 是否有使用泛型更好的办法?
另外,在get方法我投对象从到T.这似乎这样做,因为我要在这里投T和那么我也从中调用它的方法投的对象类型的特别讨厌的方式objectMapper返回。
我在这个项目中使用Roboguice所以这将是很好,如果我可以通过注射改变类型,然后标注通用型我需要它返回的对象。 我读到TypeLiteral ,不知道它是否能解决这个问题?
第一个是我传递类的类型为方法,使得objectmapper知道应该反序列化的类型。 是否有使用泛型更好的办法?
不幸的是没有了,这是因为类型擦除。
另外,在get方法我投对象从到T.这似乎这样做,因为我要在这里投T和那么我也从中调用它的方法投的对象类型的特别讨厌的方式objectMapper返回。
做到这一点,而不是:
@Override
public T get(String content, Class<T> clazz) throws IOException {
return objectMapper.readValue(content, clazz);
}
我在这个项目中使用Roboguice所以这将是很好,如果我可以通过注射改变类型,然后标注通用型我需要它返回的对象。 我读到TypeLiteral,不知道它是否能解决这个问题?
我真的不明白你想达到什么,但因为你需要通过反正类,是仍然有可能?
所以我想我理解了它的尽头。 如果你看到什么毛病我在做什么,请发表评论。
该接口的定义是这样的...
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对象使用
此文章帮助我