【问题标题】:How map Child Object input json in jackson?如何在杰克逊中映射子对象输入json?
【发布时间】:2015-11-01 07:37:22
【问题描述】:

我正在使用带有hibernate 4.2.6spring 4.0.1 的java 开发应用程序。我的应用程序是REST FULL 应用程序。为此,我使用杰克逊。我的实体如下:

Calk.java:

@Entity
public class Calk {

    @Id
    @GeneratedValue
    private Long id;
    
    @OneToMany(mappedBy="calk", fetch=FetchType.LAZY)
    List<BaseLayer> baseLayer = new ArrayList<BaseLayer>();
    
    public void addBaseLayer(BaseLayer baseLayer){
        this.baseLayer.add(baseLayer);
    }
    
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }

    @JsonIgnore
    public List<BaseLayer> getBaseLayer() {
        return baseLayer;
    }
    public void setBaseLayer(List<BaseLayer> baseLayer) {
        this.baseLayer = baseLayer;
    }
}

BaseLayer.java:

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="layer")
@JsonSubTypes(
{
    @JsonSubTypes.Type(value=PointLayer.class, name="point")
})
@DiscriminatorValue("BaseLayerDiscriminator")
public class BaseLayer {

    @Id
    @GeneratedValue
    protected Long gid;

    @ManyToOne(fetch = FetchType.LAZY)
    protected Calk calk;

    public Long getGid(){
        return gid;
    }

    public void setGid(Long gid){
        this.gid = gid;
    }
    
    @JsonIgnore
    public Calk getCalk(){
        return calk;
    }

    public void setCalk(Calk calk){
        this.calk = calk;
    }
}

现在我有一个从BaseLayer.java 扩展的类,如下所示:
PointLayer.java:

@Entity
@DiscriminatorValue("PointDiscriminator")
public class PointLayer extends BaseLayer{
    
    private String name;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

现在我如下创建一个 json,然后将其发送到控制器:

{"layer": "point", "calk":{"id":1}, "name": "itsme"}

现在控制器定义如下:

@RequestMapping("\test")
public String test(@RequestBody BaseLayer baseLayer){
   System.out.println(baseLayer.getName());// this print "itsme"
   Calk calk = baseLayer.getCalk();//it return null
   if(calk == null)
      return "its null";
   else
      return "its not null";
}

当我们调用控制器时,它返回its not nullcalk 不应该是 null

问题出在哪里?

更新
当我在getCalk 删除@JsonIgnore 时,它工作正常。但为什么?我想忽略getCalk,但不想忽略setCalk

【问题讨论】:

  • 你的意思是说你想设置calk的值但是你不想得到那个值?
  • 我想插入baseLayer记录,我想知道这个baseLayercalk中的哪一个?
  • stackoverflow.com/questions/12505141/… 这可能对你有帮助

标签: java json hibernate spring-mvc jackson


【解决方案1】:

@JsonIgnore 关注:

@JsonIgnore
public List<BaseLayer> getBaseLayer() {
    return baseLayer;
}

将忽略设置为默认以下:

public void setBaseLayer(List<BaseLayer> baseLayer) {
    this.baseLayer = baseLayer;
}

您必须在 set 函数的顶部添加@JsonProperty("baseLayer"),如下所示:

@JsonProperty("baseLayer")
public void setBaseLayer(List<BaseLayer> baseLayer) {
    this.baseLayer = baseLayer;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    相关资源
    最近更新 更多