无法使用 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 类型的主要内容,如果未能解决你的问题,请参考以下文章

我的大学,我的SPR

如何从 Java 对象向客户端发送 spring 消息

使用Spire组件抛出异常The type initializer for 'spr857' threw an exception

SFML从入门到放弃 图像和音频

如何使用 Spring Boot 和嵌入式 Tomcat 配置此属性?

Aurora 极光 A21超算将会使用SPR CPU和Ponte Vecchio GPU