关于java:我可以忽略一个杰克逊和杰克逊的二传手吗?

Can I ignore just a setter w/ Jackson & Spring?

我有一个情况,我把一个对象从Java传递到JavaScript客户端,它在3中被内置的Jackson映射器序列化(使用@请求体/@响应体和应用程序/JSON内容类型)

我遇到的问题是,一些类从一个有getter但没有setter的接口实现。

我确实希望客户机端的getter值可用,所以我不能使用@jsonignore注释,因为这样它就完全忽略了属性,包括序列化和反序列化。序列化时需要该属性。

还有别的办法吗?


可能有一种更简单的方法,但我想提到使用JSON视图作为可能的解决方案。这条线上有一个例子。

您可能需要一个不同的反序列化视图,而不仅仅是序列化视图,这是一个由Spring3.2支持并返回到Spring3.1的Jackson2.0特性。自Jackson 1.4以来,仅在序列化上使用视图是一项功能。

另一个需要考虑的选项是使用自定义反序列化程序。


我在找同样的东西。

根据Jackson文档,我们可以在一个属性、getter或setter上设置一个@JsonIgnore批注,这将隐藏整个属性,除非我们给setter一个@JsonProperty批注,以确保设置该属性时该属性可见。不幸的是,这并没有起到相反的作用。我想在我的回复中显示该属性,但不包括在我的请求中。

例如,用例是自动生成的ID。我不想让用户设置,甚至看不到,但他可以阅读。

您可以通过实际上隐藏属性本身,然后添加@JsonAnyGetter方法来实现这一点。在这种方法中,您可以将数据按摩到您想要的任何形式。它还可以用来表示复杂的属性类,您只想显示单个名称、标识符或其他格式。有更好的方法来实现后者,但是如果用例不太复杂,这就足够了。

举个例子(如果太详细的话,我很抱歉):

用户:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class User {

    private String uid;
    private String customerId;
    private String taxSsnId;

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getCustomerId() {
        return extCustomerId;
    }

    public void setCustomerId(String extCustomerId) {
        this.extCustomerId = extCustomerId;
    }

    public String getTaxSsnId() {
        return taxSsnId;
    }

    public void setTaxSsnId(String taxSsnId) {
        this.taxSsnId = taxSsnId;
    }

    @JsonIgnore
    public void getId(){
        if (getUid() != null){
            return getUid();
        }
        if (getCustomerId() != null ){
            return getCustomerId();
        }
        return null;
    }
}

设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public class Setting {

    @JsonIgnore
    private int id;

    private String key;
    private String value;

    @JsonIgnore
    private User lastUpdatedBy;

    @JsonIgnore
    private Date lastUpdatedAt;

        public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public User getLastUpdatedBy() {
        return lastUpdatedBy;
    }

    public void setLastUpdatedBy(User lastUpdatedBy) {
        this.lastUpdatedBy = lastUpdatedBy;
    }

    public Date getLastUpdatedAt() {
        return lastUpdatedAt;
    }

    public void setLastUpdatedAt(Date lastUpdatedAt) {
        this.lastUpdatedAt = lastUpdatedAt;
    }

    @JsonAnyGetter
    private Map<String, String> other() {
        Map<String, String> map = new LinkedHashMap<String, String>();
        map.put("id", this.getId());
        map.put("lastUpdatedBy", this.getLastUpdatedBy().getId());
        SimpleDateFormat format = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z");
        map.put("lastUpdatedAt", format.format(this.getLastUpdatedAt()) );
        return map;
    }

}

生成此Request模式(反序列化视图):

1
2
3
4
{
 "key":"string",
 "value":"string"
}

这个Response模式(序列化视图):

1
2
3
4
5
6
7
{
 "key":"string",
 "value":"string",
 "id":"12345",
 "lastUpdatedBy":"String",
 "lastUpdatedAt":"String"
}