如果未设置,则设置 Http 状态代码
Set the Http status code if it is not set
我正在尝试借助 Jackson 库构建一个 JSON 字符串作为服务器响应。如果路由不是 0
我得到了响应 {"status":201,"routes":null}
但我在 SDBean
class 中将状态变量设置为 204
时遇到问题如果 routeD
是 0
我在控制台中得到这个输出 {"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;
}
我建议以下解决方案之一:
初始化内联变量:
public int status = 204;
如果您需要一些额外的逻辑,您可以使用静态初始化块
static {
//additional logic here
status = 204;
}
或者在您的情况下简单地使用构造函数:
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": [?,?,?]}
}
}
}
希望对你有所帮助
我正在尝试借助 Jackson 库构建一个 JSON 字符串作为服务器响应。如果路由不是 0
我得到了响应 {"status":201,"routes":null}
但我在 SDBean
class 中将状态变量设置为 204
时遇到问题如果 routeD
是 0
我在控制台中得到这个输出 {"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;
}
我建议以下解决方案之一:
初始化内联变量:
public int status = 204;
如果您需要一些额外的逻辑,您可以使用静态初始化块
static { //additional logic here status = 204; }
或者在您的情况下简单地使用构造函数:
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": [?,?,?]}
}
}
}
希望对你有所帮助