Springboot ldap NameNotFoundException

nested exception is javax.naming.NameNotFoundException

错误信息

报错信息

原因

UserRepository#save() 内部会调用SimpleLdapRepository#isNew()判断是新增还是更新。 如果没有实现Persistable接口的话,isNew()返回false,会进行更新操作,因为Name不存在,所以就报了org.springframework.ldap.NameNotFoundException错误。

SimpleLdapRepository#save
SimpleLdapRepository#save

SimpleLdapRepository#isNew
SimpleLdapRepository#isNew

解决办法,实现Persistable接口即可。

@Entry(base = "o=beijing",objectClasses = {"person", "inetOrgPerson","organizationalPerson", "top"})
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserEntity implements Persistable {

    /**
     * ldap
     */
    @org.springframework.ldap.odm.annotations.Id
    private javax.naming.Name id;
	
	/**
	* ......
	*/

    @Transient
    private boolean newFlag;

    @Override
    public boolean isNew() {
        return newFlag;
    }
}

完整示例

依赖

<dependencies>
    <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
    </dependency>

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-ldap</artifactId>
      </dependency>

      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>${lombok.version}</version>
      </dependency>
 </dependencies>

application.yml

spring:
  ldap:
    urls:
      - ldap://localhost:30389
    base: dc=lutar,dc=com
    username: uid=admin,ou=system
    password: secret
logging:
  level:
    cn.lutar.ldap: debug

实体类

@Entry(base = "o=beijing",objectClasses = {"person", "inetOrgPerson","organizationalPerson", "top"})
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserEntity implements Persistable {

    /**
     * ldap
     */
    @org.springframework.ldap.odm.annotations.Id
    private javax.naming.Name id;

    @org.springframework.ldap.odm.annotations.Attribute(name = "uid")
    private String uuid;

    @org.springframework.ldap.odm.annotations.Attribute(name = "cn")
    private String username;

    @org.springframework.ldap.odm.annotations.Attribute(name = "sn")
    private String surname;

    @org.springframework.ldap.odm.annotations.Attribute(name = "description")
    private String description;

    @org.springframework.ldap.odm.annotations.Attribute(name = "ou")
    private String organizationUnit;

    @org.springframework.ldap.odm.annotations.Attribute(name = "telephoneNumber")
    private String telephoneNumber;

    @Transient
    private Boolean enabled;

    @Transient
    private String email;

    @Transient
    private String profile;

    @Transient
    private boolean newFlag;

    @Override
    public boolean isNew() {
        return newFlag;
    }
}

主启动类

@SpringBootApplication
@EnableLdapRepositories(basePackages = "cn.lutar.ldap.repository")
@EntityScan("cn.lutar.ldap.entity.UserEntity")
public class LDAPApplication {
    public static void main(String[] args) {
        SpringApplication.run(LDAPApplication.class, args);
    }
}

Respository

@Repository
public interface UserRepository extends LdapRepository<UserEntity> {
}

测试类

@Slf4j
@SpringBootTest(classes = LDAPApplication.class)
public class UserServiceImplTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void insertTest() {

        final LdapName name = LdapUtils.newLdapName("cn=Test2 Qin,ou=dev_dep,o=beijing");
        UserEntity user = UserEntity.builder()
                .id(name)
                .uuid(UUID.randomUUID().toString())
                .username("Test")
                .surname("Qin")
                .newFlag(true)
                .build();
        userRepository.save(user);
    }
}    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值