我正在使用Jersey 2.x
我跟随setter和getter关注POJO课程。
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
答案 0 :(得分:2)
这与泽西没有任何关系,但与Core Java&杰克逊规则。
Jersey使用Jackson处理基于POJO的JSON绑定支持,如上所述here
所以你必须了解杰克逊在接收和清空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
,其中默认int原语值为零(根据核心Java规则),因为它在输入JSON中找不到任何值。
如果您将字段类型更改为Integer
,则根据Core 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>
答案 1 :(得分:1)
如果您希望它为null
,请尝试使用Integer
代替int
。 int
不能是null
,因为它是原始类型,但Integer
可以。{&#39;
docs:https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html