我将通过说,我不使用杰克逊来开头这个问题,并且我发现的关于这个问题的所有所有问题似乎都与杰克逊有关。
我有一个小型/简单的JAX-RS API服务,但是在特定的方法调用上收到错误。首先,我将解释程序的组成。
域类
我有两个班,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"
}
这是我收到的错误:
从错误消息中可以看出,该错误是由于Request.java中的两个字段“未标记为可忽略的”引起的?
我发现的所有有关此错误的帖子都是由于某些Jackson设置所致,但是我不使用Jackson,因此无法在其中使用答案。
我怀疑如何尝试将答案添加到内存数据库中有问题(可能是由于我的两个域类的层次结构存在,因为现有请求的答案数组在尝试之前是空的添加第一个答案?),但我不确定。
希望任何人都能提供帮助,将不胜感激
其他信息
我尝试向该方法添加断点,但似乎没有击中该方法。这不是由于错误的路径/ URL或类似原因引起的,但签名可能有问题。我会继续尝试。
答案 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的名称,并且没有更改命名,因此它被称为getOriginalText
和setOriginalText
而不是{{ 1}}和getNewText
,这是正确的。显然,无论您调用了什么私有变量,Java都会从您的获取器和设置器中检索该名称,因此,相信我在setNewText
中的变量被命名为Answer.java
而不是originalText
。