nested exception is javax.naming.NameNotFoundException
错误信息
原因
UserRepository#save() 内部会调用SimpleLdapRepository#isNew()判断是新增还是更新。 如果没有实现Persistable接口的话,isNew()返回false,会进行更新操作,因为Name不存在,所以就报了org.springframework.ldap.NameNotFoundException错误。
SimpleLdapRepository#save
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);
}
}