Jersey将POJO的值设置为0

时间:2017-07-20 06:08:26

标签: java jersey-2.0

我正在使用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

2 个答案:

答案 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代替intint不能是null,因为它是原始类型,但Integer可以。{&#39;

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