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
而不是 int
。 int
不能是 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 创建了一个 AccountObject
,default 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>
我正在使用 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
而不是 int
。 int
不能是 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 创建了一个 AccountObject
,default 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>