UnrecognizedPropertyException: 未被标记为可忽略的未识别字段,来源于:org.apache.catalina.connector.CoyoteInputStream@14ec141

10

我正在编写REST Web服务,我的代码如下:

@Path("/add")
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response addMembers(List<GroupMemberMap> groupMemberMaps){
    String message = "";            
    System.out.println("Inside addMembers of class "+this.toString());      
    try {
        DBConnection.insertMembers(groupMemberMaps);
        message = "Member(s) added";
        return Response.status(Status.CREATED)
                .entity(message)
                .type(MediaType.TEXT_PLAIN)
                .build();
    } catch(SQLException sqle){
        System.out.println("addMembers catch sqle");
        message = "A problem occured while adding members : "+sqle.getMessage();
        return Response.status(Status.INTERNAL_SERVER_ERROR)
                .entity(message)
                .type(MediaType.TEXT_PLAIN)
                .build();
    }
    catch (Exception e) {
        // TODO Auto-generated catch block
        System.out.println("Inside addMembers catch  "+e.getMessage());
        message = "A problem occured while adding members : "+e.getMessage();
        return Response.status(Status.INTERNAL_SERVER_ERROR)
                .entity(message)
                .type(MediaType.TEXT_PLAIN)
                .build();
    }       
}

但当我使用这个 Json 调用它时:

[
{
    "userId":"3",
    "groupId":"4"
}
]

我遇到了以下异常:

javax.servlet.ServletException: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "userId" (Class com.tazligen.model.GroupMemberMap), not marked as ignorable at [Source: org.apache.catalina.connector.CoyoteInputStream@14ec141; line: 2, column: 15] (through reference chain: com.tazligen.model.GroupMemberMap["userId"])

我的GroupMemberMap模型类如下:

package com.tazligen.model;

@XmlRootElement
public class GroupMemberMap {

private String userId;
private String groupId;

public String getUserid() {
    return userId;
}
public void setUserid(String userId) {
    this.userId = userId;
}
public String getGroupId() {
    return groupId;
}
public void setGroupId(String groupId) {
    this.groupId = groupId;
}       }

我尝试了另一种和这个非常相似的方法:

@Path("/membertest")
@POST   
public String test(List<User> members){
    return "Test subresource members working";
}

使用 JSON

[{
"userId":"3",
"userName":"John"}]

但这样也能工作 :/

需要有人帮忙。

4个回答

21

在查看 GroupMemberMap 类后,我可以得出以下观察结果:

  1. 构造函数缺失。
  2. UserId 的 Getter-Setter 不正确。

此外,您可以添加可选的 @JsonIgnoreProperties 来忽略所有其他未知字段。

这是已经更正的代码片段:

package com.tazligen.model;

@XmlRootElement
@JsonIgnoreProperties(ignoreUnknown = true)
public class GroupMemberMap {

    @JsonProperty("userId")
    private String userId;
    @JsonProperty("groupId")
    private String groupId;

    /* Add Constructor */
    public GroupMemberMap() {}

    /* Corrected Name */
    public String getUserId() {
        return userId;
    }

    /* Corrected Name */
    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getGroupId() {
        return groupId;
    }

    public void setGroupId(String groupId) {
        this.groupId = groupId;
    }    
}

我稍微编辑了一下我的问题,您可以看到我尝试使用了一个不同的模型类,但是其中的JSON格式是相似的,不过那个方法起作用了。 - Syed Muhammad Oan
解决方案已更新,请现在尝试。 - user2004685
2
你的第二个观察点起了作用,getter和setter是错误的,我错过它的唯一原因是因为我让Eclipse自动生成它。所以我从来没有想过它会是错的,所以我从来没有注意到那部分。该死的Eclipse。非常感谢您 :) - Syed Muhammad Oan
@Muhammad 欢迎!:) - user2004685
也解决了我的问题。 - Aditya Goel

0
我之前在使用lombok来生成带有@Getter和@Setter注释的getter和setter。现在让我解决了一个类似的问题的是将字段的数据类型从Boolean的主要Java类型转换为boolean类型。只有当我使用Boolean fieldName时,Lombok才会生成getter方法。

0

只需修改 userId 和 groupId 的 public 属性即可。 默认情况下,Jackson 会处理公共成员变量。

我认为 JsonIgnoreProperties 不是解决方案,因为它用于忽略任何它不认识的内容。

public String userId;
public String groupId;

-1
上述解决方案对我有效,我在JSON对象中有一个字符串数组。 我使用了JsonIgnore属性,并替换了JSON对象内部的方括号。

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community
这并没有真正回答问题。如果您有不同的问题,可以通过点击提问来提出。如果您想在此问题获得新的答案时得到通知,您可以关注此问题。一旦您拥有足够的声望,您还可以添加悬赏以吸引更多关注。- 来自审核 - Prasanth Rajendran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接