关于java:映射json响应时忽略缺少属性

Ignore absent property when mapping json response

我有一个表格应该返回客户列表。
在两种情况下,此表单的行为应该不同:

  • 用户仅使用"姓"开始研究
  • 用户使用姓氏和名称开始研究

  • 在第一种情况下,json响应的字段少于第二种情况下的响应,因此我必须忽略所有这些字段。
    我尝试过使用@JsonInclude(JsonInclude.Include.NON_ABSENT)@JsonInclude(JsonInclude.Include.NON_EMPTY)@JsonInclude(JsonInclude.Include.NON_NULL)但是每个人都返回错误总是一样的:

    1
    java.lang.Exception: Could not write content: (was java.lang.NullPointerException) (through reference chain: it.gruppoitas.itasacquire.pojo.Cliente["DATA_NASCITA"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: it.gruppoitas.itasacquire.pojo.Cliente["DATA_NASCITA"])

    这是pojo Cliente:

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    package it.gruppoitas.itasacquire.pojo;

    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;

    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.databind.annotation.JsonSerialize;

    @JsonInclude(JsonInclude.Include.NON_ABSENT)
    public class Cliente {

    @JsonProperty("TIPO_PERSONA")
    private String tipoPersona;
    @JsonProperty("PRO_CLIE")
    private String proClie;
    @JsonProperty("CODICE_FISCALE")
    private String codiceFiscale;
    @JsonProperty("DATA_NASCITA")
    private String dataNascita;
    @JsonProperty("SESSO")
    private String sesso;
    @JsonProperty("NOME")
    private String nome;
    @JsonProperty("COGNOME")
    private String cognome;

    public String getTipoPersona() {
        return tipoPersona;
    }

    public void setTipoPersona(String tipoPersona) {
        this.tipoPersona = tipoPersona;
    }

    public String getProClie() {
        return proClie;
    }

    public void setProClie(String proClie) {
        this.proClie = proClie;
    }

    public String getCodiceFiscale() {
        return codiceFiscale;
    }

    public void setCodiceFiscale(String codiceFiscale) {
        this.codiceFiscale = codiceFiscale;
    }

    public String getDataNascita() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
        Date data = null;
        try {
            data = sdf.parse(dataNascita);
            dataNascita = new SimpleDateFormat("dd/MM/yyyy").format(data);
        } catch (ParseException e) {
            System.err.println(e);
        }
        return dataNascita;
    }

    public void setDataNascita(String dataNascita) {
        this.dataNascita = dataNascita;
    }

    public String getSesso() {
        return sesso;
    }

    public void setSesso(String sesso) {
        this.sesso = sesso;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCognome() {
        return cognome;
    }

    public void setCognome(String cognome) {
        this.cognome = cognome;
    }

    @Override
    public String toString() {
        return"Cliente [tipoPersona=" + tipoPersona +", proClie=" + proClie +", codiceFiscale=" + codiceFiscale +", dataNascita="
                + dataNascita +", sesso=" + sesso +", nome=" + nome +", cognome=" + cognome +"]";
    }}

    任何的想法?

    编辑:这是案例1中的json响应结构的示例

    1
    2
    3
    4
    5
    6
    7
    8
     {
     "TIPO_PERSONA" :"G",
     "PRO_CLIE" :"123456789",
     "CODICE_FISCALE" :"123456789",
     "PARTITA_IVA" :"123456789",
     "SESSO" :"S",
     "COGNOME" :"CUSTOMER SRL"
    }

    这是案例2中json响应的一个示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
         {  
         "TIPO_PERSONA" :"F",
         "PRO_CLIE" :"123456789",
         "CODICE_FISCALE" :"123456789",
         "DATA_NASCITA" :"1969-09-07 00:00:00.0",
         "SESSO" :"F",
         "NOME" :"Foo",
         "COGNOME" :"Fie"
        }

    正如您所看到的,案例1中的字段较少,STS处于完全恐慌模式...


    您需要配置对象映射器以使空bean失败。

    下面是一个示例代码,因为您没有自己创建ObjectMapper代码:

    1
    2
    3
    private ObjectMapper jacksonMapper = new ObjectMapper();
    jacksonMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    jacksonMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);


    您还可以使用:

    1
    jacksonMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES,false);