Невозможно создать экземпляр `javax.naming.Name` в Джексоне - PullRequest
0 голосов
/ 05 ноября 2019

Мы работаем над Spring Boot и oracle LDAP (Oid) с модулем Spring LDAP. Соединение с LDAP с пружиной в порядке, но когда мы хотим создать группу LDAP с методом ldapTemplate.create(), мы получили эту ошибку от Джексона: пожалуйста, помогите нам, что здесь не так! Спасибо

Ошибка определения типа:[простой тип, класс 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"

}

1 Ответ

0 голосов
/ 10 ноября 2019

наконец-то !! Я решил проблему! Проблема в том, что Джексон хочет десериализовать интерфейс !! (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, который является одним из реализаций Name! все отлично работает :) 1004 *

...