Jersey 将 POJO 的值设置为 0

Jersey sets value of POJO to 0

我正在使用 Jersey 2.x

我有以下 POJO class 和 setter 和 getter。

public class AccountObject {

private int accountNumber;
private int accountStatus;

//Getters and Setters

}

这是我在 Controller 中的方法签名

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces("application/json")
    public Response createAccount(AccountObject accountObject, @Context ContainerRequestContext requestContext) {

//

}  

我用空 JSON 正文调用我的 API

{}

问题是:我得到的 accountNumber 和 accoutStatus 值为 0

我已经编写了一些验证函数来检查 accountNumber 和 accountStatus,因此由于这种行为,我的函数被绕过了。

我无法理解这些值是如何分配给值 0

如果您希望它是 null,请尝试使用 Integer 而不是 intint 不能是 null,因为它是原始类型,但 Integer 可以。'

文档:https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html

这与泽西岛无关,但与核心 Java 和杰克逊规则有关。

Jersey 使用 Jackson 来处理 基于 POJO 的 JSON 绑定支持 如前所述 here

所以你必须了解 Jackson 在接收和清空 JSON 时的工作原理,如下所示,

import java.io.IOException;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;


public class App 
{
    public static void main( String[] args ) throws JsonParseException, JsonMappingException, IOException
    {

        String JSON = "{}";

        ObjectMapper mapper = new ObjectMapper();

        AccountObject acObject = mapper.readValue(JSON, AccountObject.class);

        System.out.println(acObject.getAccountNumber()+" :"+acObject.getAccountStatus());


    }
}

您会看到 Jackson 创建了一个 AccountObjectdefault int primitive 值为零(根据核心 Java 规则),因为它没有在输入 JSON 中找不到任何值。

如果您将字段类型更改为 Integer,那么根据核心 Java 默认字段规则,这些值将变为 null

int 不是引用类型,因此不能分配给 null

所以您需要根据您的验证要求更改您的 POJO 或根据您的 POJO 更改您的验证逻辑。

为了完整起见,依赖如下,

    <dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-core</artifactId>
     <version>2.8.9</version>
    </dependency>

    <dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-databind</artifactId>
     <version>2.8.9</version>
    </dependency>