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,RequestAnswer。层次结构是用户可以提出请求,然后其他用户可以回答该请求。因此,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"
}

这是我收到的错误:

从报错信息中可以看出,报错是由于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 的名称并且没有更改命名,所以它被称为 getOriginalTextsetOriginalText 而不是getNewTextsetNewText,这是正确的。显然,无论您如何称呼您的私有变量,Java 都会从您的 getter 和 setter 中检索名称,因此相信我在 Answer.java 中的变量被命名为 originalText 而不是 newText.