简单Java API-错误:无法识别的字段,未标记为可忽略

时间:2019-05-06 09:50:36

标签: java api jax-rs

我将通过说,我不使用杰克逊来开头这个问题,并且我发现的关于这个问题的所有所有问题似乎都与杰克逊有关。

我有一个小型/简单的JAX-RS API服务,但是在特定的方法调用上收到错误。首先,我将解释程序的组成。

域类

我有两个班,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"
}

这是我收到的错误:

  • 无法识别的字段“ newText”(类dk.domain.Answer),未标记为可忽略(2个已知属性:“ id”,“ originalText”]) 在[来源:(org.glassfish.jersey.message.internal.ReaderInterceptorExecutor $ UnCloseableInputStream);第2行,第21列](通过参考链:dk.domain.Answer [“ newText”])

从错误消息中可以看出,该错误是由于Request.java中的两个字段“未标记为可忽略的”引起的?

我发现的所有有关此错误的帖子都是由于某些Jackson设置所致,但是我不使用Jackson,因此无法在其中使用答案。

我怀疑如何尝试将答案添加到内存数据库中有问题(可能是由于我的两个域类的层次结构存在,因为现有请求的答案数组在尝试之前是空的添加第一个答案?),但我不确定。

希望任何人都能提供帮助,将不胜感激

其他信息

我尝试向该方法添加断点,但似乎没有击中该方法。这不是由于错误的路径/ URL或类似原因引起的,但签名可能有问题。我会继续尝试。

1 个答案:

答案 0 :(得分:0)

问题是我在Answer.java中的吸气剂和吸气剂,而我没有将其包含在OP中。

我从Request.java类中复制了吸气剂和设置器,但没有更改命名,所以我的Answer.java类看起来像这样(我在重要的行上加上了注释“ PAY ATTENTION”): / p>

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而不是{{ 1}}和getNewText,这是正确的。显然,无论您调用了什么私有变量,Java都会从您的获取器和设置器中检索该名称,因此,相信我在setNewText中的变量被命名为Answer.java而不是originalText