不建议使用Jackson constructParametricType,但constructParameterizedType的工作方式不同

时间:2015-02-13 14:58:42

标签: jackson

这是我的代码段,以及更新的" constructParameterizedType"并不符合我的需要(除非我遗漏了一些东西,我认为我是这样)。我有一个名为Result的泛化类,其中T是任何扩展我的" Inflatable"基类。表示从Salesforce REST API返回的数据记录...所以这里是有效的代码示例:

Class c = Class.forName("sfshare.UserRecord" );
JavaType type = mapper.getTypeFactory().constructParametricType(Result.class, c);
Result<T> res = mapper.readValue(rspData, type);

但是如果我使用较新的(不推荐的)&#34; constructParameterizedType()&#34;方法,这个相同的代码将不会编译,因为它不匹配constructParameterizedType的参数。但是constructParameterizedType还没有被使用,并且没有使用的例子......只有Javadoc - 这对我的用例没有意义。

2 个答案:

答案 0 :(得分:4)

如果你看一下参数,特别是Javadocs,你会注意到有一个新类型:第二个参数是预期的&#39;目标&#39;用于参数。 举一个含义的例子是,如果你想构造等价的:

ArrayList<String>

您想要传递的参数是:

constructParameterizedType(ArrayList.class, List.class, String.class)
对于第二个参数,

或者可能是Collection.class。 可以将其视为您尝试为其提供参数的基础相关类型。

这种变化的根本原因有点复杂,并且与处理&#34;附加组件&#34;像Iterable<T>这样的接口:对于这些情况,有必要提供不同的类。

但是在大​​多数最终用户用例中,您只需要传递与第一个和第二个参数相同的类。

答案 1 :(得分:3)

试试这个:

Class c = Class.forName("sfshare.UserRecord");
TypeFactory typeFactory = mapper.getTypeFactory();
JavaType type = typeFactory.constructParametrizedType(Result.class, Result.class, c);
Result<T> res = mapper.readValue(rspData, type);

或者您的Result<T>类实现了接口:

JavaType type = typeFactory.constructParametrizedType(Result.class, ResultInterface.class, c);