Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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中使用不同的方法来设置和获取属性,为什么objectMapper会失败?_Java_Json_String_Object_Jackson - Fatal编程技术网

如果我在Java中使用不同的方法来设置和获取属性,为什么objectMapper会失败?

如果我在Java中使用不同的方法来设置和获取属性,为什么objectMapper会失败?,java,json,string,object,jackson,Java,Json,String,Object,Jackson,我有一个名为Car的类,它代表一个实体,它有一个属性,让我知道汽车是否开门 private int doorsOpened; public void setDoorsOpened( val ) { this.doorsOpened = val; } public int getDoorsOpened() { return this.doorsOpened; } 当我需要知道这一点时,我只需打电话: if (car.getDoorsOpened() != 0) { car.startAl

我有一个名为Car的类,它代表一个实体,它有一个属性,让我知道汽车是否开门

private int doorsOpened;
public void setDoorsOpened( val ) { this.doorsOpened = val; }
public int getDoorsOpened() { return this.doorsOpened; }
当我需要知道这一点时,我只需打电话:

if (car.getDoorsOpened() != 0) {
    car.startAlarm();
}
else {
    car.allIsFine();
}
但是,我不想使用
getDoorsOpened()0
comparison,因此我创建了一个名为
doorsOpened()
的新方法,它为我带来了布尔值:

public boolean doorsOpened() { return this.doorsOpened != 0; }
但当我想这样做时,使用这种新方法:

String carData = objectMapper.writeValueAsString( car ); 
我得到一个例外:

Unhandled server exception: (was java.lang.NullPointerException) (through reference chain: com.desafioguerreros.artifacts.car.entities.Car["volunteer"])
com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: com.desafioguerreros.artifacts.car.entities.Car["volunteer"])
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:232)
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:197)
    at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:187)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:647)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:114)
    at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:2866)
    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:2323)

为什么?

首先,看到stacktrace,看起来实体中的一个属性为null,这导致了异常。如果我的理解是正确的,如果你有一个非常规的接球手,杰克逊会忽略场地,不会抛出任何异常。如果希望有一个自定义getter并在序列化中包含该字段,可以使用
@JsonProperty
,如下所示

public class car{
    private int doorsOpened;

    @JsonProperty(value="doorsOpened")
    public boolean doorsOpened(){
        return this.doorsOpened != 0; 
    }

}

首先,看到stacktrace,看起来实体中的一个属性为null,这导致了异常。如果我的理解是正确的,如果你有一个非常规的接球手,杰克逊会忽略场地,不会抛出任何异常。如果希望有一个自定义getter并在序列化中包含该字段,可以使用
@JsonProperty
,如下所示

public class car{
    private int doorsOpened;

    @JsonProperty(value="doorsOpened")
    public boolean doorsOpened(){
        return this.doorsOpened != 0; 
    }

}