无法在杰克逊中构造javax.naming.Name的实例

我们使用Spring LDAP模块开发Spring Boot和oracle LDAP(Oid)。用spring与LDAP的连接是可以的,但是当我们想用ldapTemplate.create()方法创建LDAP组时,我们从Jackson收到了这个错误: 请帮助我们,这里出了什么问题!谢谢

  

类型定义错误:[简单类型,类javax.naming.Name];嵌套的异常是com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造javax.naming.Name的实例(不存在像默认构造一样的创建者)

//Group Entry
    @Getter
    @Setter
    @Entry(objectClasses = {"top","groupOfUniqueNames"},base = "cn=Groups")
    public final class Group {

        private static final String BASE_DN = "dc=eis,dc=msc,dc=ir";

        @Id
        private Name dn;

        @Attribute(name="cn")
        @DnAttribute("cn")
        private String name;

        @Attribute(name = "displayName")
        private String description;

        @Attribute(name = "owner")
        private String owner;

        @Attribute(name="uniqueMember")
        private Set members;

        public Group() {
        }

        public Group(String name,Set members) {
                Name dn =  LdapNameBuilder.newInstance(BASE_DN)
                        .add("ou","groups")
                        .add("cn",name)
                        .build();
                this.dn = dn;
                this.name = name;
                this.members = members;
        }

        public Group(Name dn,String name,String description,String owner,Set members) {
            this.dn = dn;
            this.name = name;
            this.description = description;
            this.owner = owner;
            this.members = members;
        }

        public void addMember(Name member) {
            if (this.members == null){
                this.members = new HashSet<>();
            }
            members.add(member);
        }

        public void removeMember(Name member) {
            members.remove(member);
        }

        @Override
        public String toString() {
            return "Group{" +
                    "dn=" + dn +
                    ",name='" + name + '\'' +
                    ",members=" + members +
                    '}';
        }

    //Service

    @Override
        public int createOIDGroupByJob(Group group) {
            try {
                ldapTemplate.create(group);
                return 1;
            }catch (Exception e){
                return 0;
            }
        }

    @PostMapping("/api/ldap/group")
            public ResponseEntity<?> add(@RequestBody Group group) {
                int retVal = ldapService.createOIDGroupByJob(group);
                if (retVal==1) {
                    return new ResponseEntity<>(HttpStatus.OK);
                } else {
                    return new ResponseEntity<>(HttpStatus.EXPECTATION_FAILED);
                }
            }
//in postman

    {
    "dn": {
        "rdns": [
            {
                "value": "Groups","type": "cn"
            },{
                "value": "some data","type": "cn"
            }
        ]
    },"fullName": "some data","lastName": "some data"

}
lwword 回答:无法在杰克逊中构造javax.naming.Name的实例

最后!我解决了问题!问题是杰克逊想对接口进行反序列化!(javax.naming.Name)并且它没有唤醒! 我发现解决方法是在构造函数上使用@JsonCreator:

//User Ldap Entry
 public User(Name dn,String name,String lastName,String group) {
        this.dn = dn;
        this.name = name;
        this.lastName = lastName;
        this.group = group;
    }

    @JsonCreator
    public User(@JsonProperty("dn") @JsonDeserialize(as=LdapName.class) final Name dn) {
        this.dn = dn;
    }
通过上述示例

!在@JsonDeserialize(as = LdapName.class)中,我传递了LdapName.class,它是名称实现之一!效果很好:)

本文链接:https://www.f2er.com/3160005.html

大家都在问