Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我能忽略一个二传手吗;春天_Java_Json_Spring_Jackson - Fatal编程技术网

Java 我能忽略一个二传手吗;春天

Java 我能忽略一个二传手吗;春天,java,json,spring,jackson,Java,Json,Spring,Jackson,我遇到了这样一种情况:我将一个对象从Java传递回Javascript客户端,并在Spring 3中由内置的Jackson映射器对其进行序列化(使用@RequestBody/@ResponseBody和application/json内容类型) 我遇到的问题是一些类是从一个接口实现的,该接口有一个getter,但没有setter 我确实希望getter值可以从客户端获得,所以我不能使用@JsonIgnore注释,因为这样它会完全忽略属性,包括序列化和反序列化。序列化时我需要该属性 还有其他方法吗

我遇到了这样一种情况:我将一个对象从Java传递回Javascript客户端,并在Spring 3中由内置的Jackson映射器对其进行序列化(使用@RequestBody/@ResponseBody和application/json内容类型)

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

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


还有其他方法吗?

可能有一种更简单的方法,但我想提及的是使用作为一种可能的解决方案。上面有一个例子

您可能需要不同的反序列化视图,而不仅仅是序列化视图,这将是Jackson 2.0的一个特性-。仅在序列化上使用视图是自Jackson 1.4以来的一项功能


我想到的另一个选择是使用。

我也在寻找同样的东西

根据,我们可以在属性、getter或setter上设置一个
@JsonIgnore
注释,这将隐藏完整的属性,除非我们给setter一个
@JsonProperty
注释,以确保该属性在设置时可见。不幸的是,反过来也不行。我想在响应中显示属性,但不想将其包含在请求中

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

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

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

用户:

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;
    }
}
设置:

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;
    }

}
这个
响应
模式(序列化视图):


在类中没有setter的情况下,如何反序列化属性值?我不关心反序列化。反序列化时可以忽略它。嗯。。。但是你说“我确实希望getter值可以从客户端获得”-因此它在json中是可用的,客户端javascript发送给你,你需要这个值,这难道不意味着你在反序列化(json->java)时需要它,而在序列化(java->json)时不需要它吗?我需要在javascript中使用java->json,我不喜欢返回JSON>Java。谢谢,我将使用这些选项。缺点是模式没有正确表示。在
@JsonAnyGetter
方法中设置的字段不会明显显示。如果有人有更好的方法?
{
  "key": "string",
  "value": "string"
}
{
  "key": "string",
  "value": "string",
  "id": "12345",
  "lastUpdatedBy": "String",
  "lastUpdatedAt": "String" 
}