spring ldap导入ldif

67 阅读1分钟

问题

因为工作需要,希望通过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上传文件进行测试

image.png

结论

通过spring ldap的LdifParser可以实现Ldif文件的解析,通过自定义的属性转换方法,实现到POJO的转换。

spring ldap官方还说明可以通过spring batch实现Ldif中数据到POJO的转换,当前没有使用。

引用