Simple Java API - Error: Unrecognized field, not marked as ignorable
Simple Java API - Error: Unrecognized field, not marked as ignorable
我会在这个问题的开头说,我不使用 Jackson - 所有 我发现的关于这个问题的问题似乎都与 Jackson 有关。
我有一个 small/simple JAX-RS API 服务,但我在特定方法调用时收到错误。首先,我将解释我的程序由什么组成。
域classes
我有两个 class,Request
和 Answer
。层次结构是用户可以提出请求,然后其他用户可以回答该请求。因此,Request.java 包含答案的 ArrayList,以便可以将答案添加到特定请求。
Request.java (特别注意ArrayList的答案)
public class Request {
private int id;
private String originalText;
public ArrayList<Answer> answers = new ArrayList<Answer>(); //pay attention
//getters and setters - removed for brevity
}
Answer.java
public class Answer {
private int requestId;
private String newText;
//getters and setters - removed for brevity
}
端点
端点由我的 HTTP 请求组成。它使用内存存储。 我有另一个 POST 方法可以将请求发布到内存数据库,但为了简洁起见,我没有发布它。
我在下面遇到问题的 POST 方法 createAnswer
试图保存对现有请求的回答。
Endpoint.java
public class Endpoint {
private Map<Integer, Request> inMemoryDb = new ConcurrentHashMap<Integer, Request>();
private AtomicInteger idCounter = new AtomicInteger();
@POST
@Path("/answer/{id}")
@Consumes({MediaType.APPLICATION_JSON})
public Response createAnswer(Answer answer, @PathParam("id") int id) {
final Request request = inMemoryDb.get(id);
if (request == null) {
return Response.status(404).entity("Request not found").build();
}
else {
request.answers.add(answer);
return Response.ok().build();
}
}
}
如您所见,我尝试在 if 语句中添加对现有请求的回答:request.answers.add(answer);
我使用 JSON:
向 Postman 发出 POST 请求
{
"requestId": 1,
"newText": "Hello World"
}
这是我收到的错误:
- 无法识别的字段 "newText" (class dk.domain.Answer),未标记为可忽略(2 个已知属性:"id"、"originalText"])
在 [来源: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream);行:2,列:21](通过引用链:dk.domain.Answer["newText"])
从报错信息中可以看出,报错是由于Request.java中的两个字段"not marked as ignorable"?
我发现的所有关于此错误的帖子 都是由于某些 Jackson 设置造成的,但我不使用 Jackson,所以我无法使用其中的答案.
我怀疑我尝试向内存数据库添加答案的方式有问题(可能是由于我的两个域 classes 的层次结构,因为一个答案数组在尝试添加第一个答案之前现有请求为空?),但我不确定。
希望有人能提供帮助,将不胜感激
额外信息
我试过给方法加断点,但是好像没有打到方法上。这不是由于错误的 path/URL 或类似的原因,而是签名可能有问题。我会继续努力的。
问题出在 Answer.java
中的 getter 和 setter,我没有将其包含在 OP 中。
我从我的 Request.java
class 复制了 getter 和 setter 并且没有更改命名,所以我的 Answer.java
class 看起来像这样(我已经标记为重要注释行 "PAY ATTENTION"):
public class Answer {
private int requestId;
private String newText; //variable is called newText, but getters and setters are named after a variable in Request.java, originalText
public int getRequestId() {
return requestId;
}
public void setRequestId(int requestId) {
this.requestId = requestId;
}
public String getOriginalText() { //PAY ATTENTION TO NAME OF GETTER
return newText;
}
public void setOriginalText(String newText) { //PAY ATTENTION TO NAME OF SETTER
this.newText = newText;
}
}
如您所见,我从 Request.java
复制了我的 getter 和 setter 的名称并且没有更改命名,所以它被称为 getOriginalText
和 setOriginalText
而不是getNewText
和 setNewText
,这是正确的。显然,无论您如何称呼您的私有变量,Java 都会从您的 getter 和 setter 中检索名称,因此相信我在 Answer.java
中的变量被命名为 originalText
而不是 newText
.
我会在这个问题的开头说,我不使用 Jackson - 所有 我发现的关于这个问题的问题似乎都与 Jackson 有关。
我有一个 small/simple JAX-RS API 服务,但我在特定方法调用时收到错误。首先,我将解释我的程序由什么组成。
域classes
我有两个 class,Request
和 Answer
。层次结构是用户可以提出请求,然后其他用户可以回答该请求。因此,Request.java 包含答案的 ArrayList,以便可以将答案添加到特定请求。
Request.java (特别注意ArrayList的答案)
public class Request {
private int id;
private String originalText;
public ArrayList<Answer> answers = new ArrayList<Answer>(); //pay attention
//getters and setters - removed for brevity
}
Answer.java
public class Answer {
private int requestId;
private String newText;
//getters and setters - removed for brevity
}
端点
端点由我的 HTTP 请求组成。它使用内存存储。 我有另一个 POST 方法可以将请求发布到内存数据库,但为了简洁起见,我没有发布它。
我在下面遇到问题的 POST 方法 createAnswer
试图保存对现有请求的回答。
Endpoint.java
public class Endpoint {
private Map<Integer, Request> inMemoryDb = new ConcurrentHashMap<Integer, Request>();
private AtomicInteger idCounter = new AtomicInteger();
@POST
@Path("/answer/{id}")
@Consumes({MediaType.APPLICATION_JSON})
public Response createAnswer(Answer answer, @PathParam("id") int id) {
final Request request = inMemoryDb.get(id);
if (request == null) {
return Response.status(404).entity("Request not found").build();
}
else {
request.answers.add(answer);
return Response.ok().build();
}
}
}
如您所见,我尝试在 if 语句中添加对现有请求的回答:request.answers.add(answer);
我使用 JSON:
向 Postman 发出 POST 请求{
"requestId": 1,
"newText": "Hello World"
}
这是我收到的错误:
- 无法识别的字段 "newText" (class dk.domain.Answer),未标记为可忽略(2 个已知属性:"id"、"originalText"]) 在 [来源: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream);行:2,列:21](通过引用链:dk.domain.Answer["newText"])
从报错信息中可以看出,报错是由于Request.java中的两个字段"not marked as ignorable"?
我发现的所有关于此错误的帖子 都是由于某些 Jackson 设置造成的,但我不使用 Jackson,所以我无法使用其中的答案.
我怀疑我尝试向内存数据库添加答案的方式有问题(可能是由于我的两个域 classes 的层次结构,因为一个答案数组在尝试添加第一个答案之前现有请求为空?),但我不确定。
希望有人能提供帮助,将不胜感激
额外信息
我试过给方法加断点,但是好像没有打到方法上。这不是由于错误的 path/URL 或类似的原因,而是签名可能有问题。我会继续努力的。
问题出在 Answer.java
中的 getter 和 setter,我没有将其包含在 OP 中。
我从我的 Request.java
class 复制了 getter 和 setter 并且没有更改命名,所以我的 Answer.java
class 看起来像这样(我已经标记为重要注释行 "PAY ATTENTION"):
public class Answer {
private int requestId;
private String newText; //variable is called newText, but getters and setters are named after a variable in Request.java, originalText
public int getRequestId() {
return requestId;
}
public void setRequestId(int requestId) {
this.requestId = requestId;
}
public String getOriginalText() { //PAY ATTENTION TO NAME OF GETTER
return newText;
}
public void setOriginalText(String newText) { //PAY ATTENTION TO NAME OF SETTER
this.newText = newText;
}
}
如您所见,我从 Request.java
复制了我的 getter 和 setter 的名称并且没有更改命名,所以它被称为 getOriginalText
和 setOriginalText
而不是getNewText
和 setNewText
,这是正确的。显然,无论您如何称呼您的私有变量,Java 都会从您的 getter 和 setter 中检索名称,因此相信我在 Answer.java
中的变量被命名为 originalText
而不是 newText
.