如果未设置,则设置 Http 状态代码

Set the Http status code if it is not set

我正在尝试借助 Jackson 库构建一个 JSON 字符串作为服务器响应。如果路由不是 0 我得到了响应 {"status":201,"routes":null} 但我在 SDBean class 中将状态变量设置为 204 时遇到问题如果 routeD0 我在控制台中得到这个输出 {"status":204,"routes":[1,9,3]} 但在 POSTMAN chrome 扩展中,响应时间太长,我得到这个输出 The response status was 0. Check out the W3C XMLHttpRequest Level 2 spec for more details about when this happens. 如果 routeD 不为 0,我想得到以下结果 {"status":201} else {"routes": {1,3,9}}

我如何与 Jakson 一起管理它?

接收者class:

@Path("/data")
public class Receiver {

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response storeData(Data data) {
        Database db = new Database();

        String macD = data.getMac();
        int routeD = data.getRoute();
        double latD = data.getLatitude();
        double longD = data.getLongitude();
        double speedD = data.getSpeed();

        SDBean bean = new SDBean();
        if (routeD != 0) {
            bean.status = db.insertData(macD, routeD, latD, longD);
            return Response.status(bean.status).entity(bean.toJson()).build();

        } else {
            bean.routes = db.detectRoute(latD, longD);
            return Response.status(bean.status).entity(bean.toJson()).build();

        }

    }

}

SDBean class:

import java.util.ArrayList;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class SDBean {

    public int status;
    public ArrayList<Integer> routes;

    public String toJson() {

        ObjectMapper mapper = new ObjectMapper();
        String json = null;

        if(status == 0){
            this.status = 204;
        }

        try {
            json = mapper.writeValueAsString(this);
        } catch (JsonProcessingException e) {
            e.printStackTrace();

        }
        return json;
    }

}

您的问题是 0 响应,因为您没有在 bean 中初始化您的 int 值。当您尝试分析您的代码时:

//Inside Receiver 
return Response.status(bean.status).entity(bean.toJson()).build();

在这一行中,您首先从 bean 的状态字段中获取值。它使用默认值 0 (Oracle documentation about primitive data types and default values) 进行初始化,然后将其映射到 Json(),在此行中将其值设置为状态响应 204:

//Inside SDBean
if(status == 0){
    this.status = 204;
}

我建议以下解决方案之一:

  1. 初始化内联变量:

    public int status = 204;

  2. 如果您需要一些额外的逻辑,您可以使用静态初始化块

    static {
        //additional logic here
        status = 204;
    }
    
  3. 或者在您的情况下简单地使用构造函数:

    public SDBean(){
        //additional logic here
        status = 204;
    }
    

有关更多信息,请参阅文档:Initializing fields

此外,您没有向 ArrayList 添加任何内容。尝试在您的 bean 内联初始化它:

public ArrayList<Integer> routes = new ArrayList<Integer>();

或者如果您使用 jdk 1.7+,请改用钻石接口

public ArrayList<Integer> routes = new ArrayList<>();

现在您可以使用它在 storeData 中添加数据 class:

bean.routes.add(yourIntValue);

// 编辑:

package com.gmail.at.mironiuk.kacper.stack.overflow.wtf;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Path("/data")
public class Receiver {

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response storeData(Data data) {
        Database db = new Database();
        SDBean bean = new SDBean();

        String macD = data.getMac();
        int routeD = data.getRoute();
        double latD = data.getLatitude();
        double longD = data.getLongitude();
        double speedD = data.getSpeed();

        if (routeD != 0) { // here you always will have null or empty case you only set your status here
            bean.status = db.insertData(macD, routeD, latD, longD); // In this if try to add sth to your list
            bean.status = 204;
            return Response.status(bean.status).entity(bean.toJson()).build(); //Expected result {"status":"204", "routes": []}
        } else { // here your List will be this whats you returns from
            bean.routes = db.detectRoute(latD, longD); // <- this function and i don't know what function returns
            return Response.status(bean.status).entity(bean.toJson()).build(); //Expected result {"status":"204", "routes": [?,?,?]}
        }
    }

}

希望对你有所帮助