无法使用 guava-datatype 从 Spring 服务中使用 GWTP-Rest + jackson-guava 反序列化 guava 类型

Posted

技术标签:

【中文标题】无法使用 guava-datatype 从 Spring 服务中使用 GWTP-Rest + jackson-guava 反序列化 guava 类型【英文标题】:can't deserialize guava type with GWTP-Rest + jackson-guava from Spring service using guava-datatype 【发布时间】:2014-08-19 12:29:39 【问题描述】:

我使用 GWTP-Rest,我需要反序列化一个包含 ListMultimap 的 dto。 dto 的所有元素都是反序列化的,但不是 ListMultimap。在dto的代码下方。 JsonAnnotation 正在工作并且来自与 gwt-jackson 兼容的正确 artifactId。我使用 maven gwt-guava-jackson 导入并继承该模块。

公共类 GetdtoMobileResult 实现 ExpirableResult、DtoData

@JsonProperty("diffusions")
private ListMultimap<Integer, Diffusion> diffusions;

private TimeInterval visibleRange;

@JsonProperty("ttl")
private long ttl;

private dtoHourRange hourRange;

GetTVGuideMobileResult() 
    super();


public GetTVGuideMobileResult(
        final ArrayListMultimap<Integer, Diffusion> diffusions,
        final TimeInterval visibleRange, final long ttl, final MediamatHourRange range) 
    super();
    this.diffusions = diffusions;
    this.visibleRange = visibleRange;
    this.ttl = ttl;
    this.hourRange = range;


@JsonIgnore
@Override
public ListMultimap<ChannelId, Diffusion> getDiffusions() 
    return ArrayListMultimap.create();


@JsonProperty("diffusions")
public ListMultimap<Integer, Diffusion> getdiffusions()

    return diffusions;


@Override
public TimeInterval getVisibleRange() 
    return visibleRange;


@JsonProperty("ttl")
@Override
public long ttl() 

    return ttl;


@Override
public dtoHourRange getHourRange() 
    return hourRange;


// #### setter add to able deserialization on client side mobile. ######
@JsonProperty("diffusions")
public void setDiffusions(final ListMultimap<Integer, Diffusion> diffusions) 
    this.diffusions = diffusions;


public void setHourRange(final dtoHourRange hourRange) 
    this.hourRange = hourRange;


@JsonProperty("ttl")
public void setTtl(final long ttl) 
    this.ttl = ttl;


public void setVisibleRange(final TimeInterval visibleRange) 
    this.visibleRange = visibleRange;

我从服务器 "diffusions":"..." ,... 收到正确的对象。序列化是由 lib jackson-datatype-guava 进行的,如果我正确理解,它是由 jackson-guava 使用的。实现的接口定义了对象的getter,并实现了Serializable。

我还有另一个问题,可能与他有关,我的 ListMultimap 使用正常的 dto 作为包装整数的键,但杰克逊告诉我不支持我的 dto 作为地图的键。我的 dto 代码:

公共类 DtoId 实现可序列化

/**
 * serial version Uid
 */
private static final long serialVersionUID = -5816632906385308130L;

private int id;

DtoId() 
    // for serialization


public DtoId(final int id) 
    super();
    this.id = id;


public int getId() 
    return id;


public void setId(final int id) 
    this.id = id;


@Override
public String toString() 
    return Integer.toString(id);


@Override
public int hashCode() 
    final int prime = 31;
    int result = 1;
    result = prime * result + id;
    return result;


@Override
public boolean equals(final Object obj) 
    if (this == obj) 
        return true;
    
    if (obj == null) 
        return false;
    
    if (getClass() != obj.getClass()) 
        return false;
    
    ChannelId other = (ChannelId) obj;
    if (id != other.id) 
        return false;
    
    return true;

【问题讨论】:

【参考方案1】:

好的,问题来自项目对番石榴的不良依赖性。我向客户端、共享和服务器提供了相同版本的番石榴,现在序列化工作了,抱歉这个问题。

第二个错误继续出现,我将在另一个页面上发布。

【讨论】:

以上是关于无法使用 guava-datatype 从 Spring 服务中使用 GWTP-Rest + jackson-guava 反序列化 guava 类型的主要内容,如果未能解决你的问题,请参考以下文章