为了账号安全,请及时绑定邮箱和手机立即绑定

Java Jackson 对象映射器在正确的变量名上失败

Java Jackson 对象映射器在正确的变量名上失败

www说 2022-06-04 17:46:14
我知道变量命名不正确。我正在清理另一个将这些列为成员变量的开发人员的旧代码。它们将被正确命名,是的,我知道我需要注释,但我在这里寻找的是关于为什么变量是 EmployeeId 的解释,它正在寻找 EmployeeID,但找到一个不存在的变量 mEmployeeId。顺便说一句,这发生在服务器上,而不仅仅是在 IDE 中。由于某些未知的原因 - 在修改变量名称、保存、重新启动、使缓存无效等所有内容之后 - 杰克逊未能映射到正确的变量名称。为此,我将 intelliJ 与 Java 一起使用。错误:Exception in badge service getting by badgeId: Unrecognized field "EmployeeId" (class com.companyName.attendance.entity.DTOs.badgeservice.BadgeDTO), not marked as ignorable (6 known properties: "mBadgeId", "mEmployeeId", "mLanId", "mFirstName", "mEmail", "mLastName"]) at [Source: (String)"{"backoff":null,"error_id":null,"error_message":null,"error_name":null,"has_more":false,"items":[{"EmployeeId":"888888","LanId":"NTest","FirstName":"Name","MiddleName":null,"LastName":"Test","Email":null,"Location":null,"Title":null,"Phone":null,"DepartmentId":null,"DepartmentName":null,"DepartmentNumber":null,"Groups":null,"Found":false,"BadgeId":"222222","JobTitle":null,"Picture":null,"OrgUrl":null,"Manager":null,"Coworkers":null,"DirectReports":null}],"page":null,"page_size":null,"quo"[truncated 61 chars]; line: 1, column: 113] (through reference chain: com.companyName.attendance.entity.DTOs.badgeservice.BadgeServiceResponseDTO["items"]->java.util.ArrayList[0]->com.companyName.attendance.entity.DTOs.badgeservice.BadgeDTO["EmployeeId"])如您所见,它没有在 DTO 中找到 EmployeeId,并说预期的字段是 mEmployeeID。但是,这是我的 DTO 变量声明:public class BadgeDTO {//TODO: Convert member variables to proper practice namesString BadgeId;String EmployeeId;String FirstName;String LanId;String LastName;String Email;public BadgeDTO(String BadgeId, String EmployeeId, String FirstName, String LanId, String LastName, String Email) {    super();    this.BadgeId = BadgeId;    this.EmployeeId = EmployeeId;    this.FirstName = FirstName;    this.LanId = LanId;    this.LastName = LastName;    this.Email = Email;}public BadgeDTO() {    super();}public String getmBadgeId() {    return BadgeId;}
查看完整描述

2 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

答案通常是:注意您编写的代码。

getter 和 setter 将字段公开为 m*(其中 * 是实际的字段名称)。

看这个:

getmEmployeeId(
   ^
   |

这是字母“m”。

因此,这会将字段名称公开为“mEmployeeId”

更多细节:
方法返回的值与 getter 暴露的值的名称无关。Java 要求 getter 名称的格式为“getFieldName”,而 setter 名称的格式为“setFieldName”,其中“FieldName”是任何不是方法名称“get”或“set”部分的值。

这称为“JavaBean 命名约定”,如果您使用 Java 编码并使用任何第三方 Java 库,您绝对必须理解并遵守它。


查看完整回答
反对 回复 2022-06-04
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

要将JSON键与POJO属性匹配,请Jackson使用名为PropertyNamingStrategy. 在你的JSON我们可以找到至少两种策略:


SNAKE_CASE ( page_size, error_message, 等)

UPPER_CAMEL_CASE ( EmployeeId, DepartmentId, 等)

From other sidePOJO类提供第三种策略:


"m" + UPPER_CAMEL_CASE ( mEmployeeId, mDepartmentId, 等)

这就是为什么JSON不匹配POJO。要使其发挥作用,您需要实施如下所示的新策略:


class MNamingStrategy extends PropertyNamingStrategy {


    @Override

    public String nameForSetterMethod(MapperConfig<?> config, AnnotatedMethod method,

        String defaultName) {

        return defaultName.substring(1); // remove first `m` letter

    }

}

你可以这样使用它:


@JsonNaming(MNamingStrategy.class)

class Clazz {


    private int Id = 11;


    public int getmId() {

        return Id;

    }


    public void setmId(int id) {

        this.Id = id;

    }


    @Override

    public String toString() {

        return "Clazz{" +

            "Id=" + Id +

            '}';

    }

}

从现在开始,您可以将上面JSON的反序列化为 given POJO。


当您添加@JsonProperty带有属性名称的注释时,您已告知Jackson使用自定义映射。


查看完整回答
反对 回复 2022-06-04
  • 2 回答
  • 0 关注
  • 268 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号