问题
因为工作需要,希望通过java实现ldif文件的导入。
探索
在网上搜“java实现ldif导入”,可以发现通过novell ldap实现的词条。但是,由于项目本身已经集成spring-boot-starter-data-ldap,因此更希望寻找spring ldap导入ldif的方法。查看spring ldap的官方网站,在说明文档中可以发现spring ldap可以实现LDIF解析。依据官方提供的测试样例代码,完成spring ldap导入ldif文件并解析的web项目搭建。
试验
1)项目配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-ldap</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ldap</groupId>
<artifactId>spring-ldap-ldif-core</artifactId>
<version>2.3.3.RELEASE</version>
</dependency>
当前spring-boot-starter-parent版本是2.2.13.RELEASE
由于spring-boot-starter-data-ldap传递性引入的spring-ldap-core并不包含ldif的解析功能,因此需要引入spring-ldap-ldif-core依赖。
2)控制器
编写控制器,处理上传ldif文件的请求。
@RequestMapping(value ="/upload",method = RequestMethod.POST)
public Map<String,Object> importLdif(@RequestParam String fileName,
@RequestPart("file") MultipartFile filePart){
Map<String,Object> resultMap=organService.importOrgan(filePart.getResource());
resultMap.put("fileName",fileName);
return resultMap;
}
3)业务逻辑
在organService的importOrgan方法中实现导入Ldif、解析,并转化为对应的POJO对象的过程
@Override
public Map<String, Object> importOrgan(Resource resource) {
Map<String,Object> resultMap=new HashMap<>();
List<OrganEntity> organEntityList=new ArrayList<>();
LdifParser parser= new LdifParser();
parser.setResource(resource);
try{
parser.open();
while(parser.hasMoreRecords()){
LdapAttributes attributes=parser.getRecord();
if(attributes!=null){
OrganEntity organEntity=ORGAN_ATTRIBUTE_ENTITY_MAPPER.apply(attributes);
organEntityList.add(organEntity);
}
}
}catch(Exception e){
e.printStackTrace();
}
resultMap.put("data",organEntityList);
return resultMap;
}
其中,ORGAN_ATTRIBUTE_ENTITY_MAPPER是自定义的LdapAttributes转为POJO对象OrganEntity的方法
private final Function<LdapAttributes, OrganEntity> ORGAN_ATTRIBUTE_ENTITY_MAPPER=new Function<LdapAttributes, OrganEntity>(){
@Override
public OrganEntity apply(LdapAttributes attributes) {
OrganEntity organEntity=new OrganEntity();
try{
String dn=attributes.getDN().toString();
dn=dn.substring(0,dn.indexOf(BASE)-1);
organEntity.setDescription(dn);
String name;
Attribute nameAttribute=attributes.get("ou");
if(nameAttribute.get() instanceof byte[]){
name=new String((byte[])nameAttribute.get());
}else{
name=(String)nameAttribute.get();
}
organEntity.setOrganName(name);
String description;
Attribute descAttribute=attributes.get("description");
if(descAttribute.get() instanceof byte[]){
description=new String((byte[])descAttribute.get());
}else{
description=(String)descAttribute.get();
}
organEntity.setDescription(description);
}catch(Exception e){
e.printStackTrace();
}
return organEntity;
}
} ;
4)运行
通过apifox上传文件进行测试
结论
通过spring ldap的LdifParser可以实现Ldif文件的解析,通过自定义的属性转换方法,实现到POJO的转换。
spring ldap官方还说明可以通过spring batch实现Ldif中数据到POJO的转换,当前没有使用。