如何修复异常java.lang.ClassCastException:从AD获取objctGUID时,java.lang.String无法强制转换为[B?

时间:2017-07-26 13:29:30

标签: java active-directory spring-ldap ldap-query

我试图从Windows AD获取唯一标识符。但是在以下代码行中:

byte[] objGUIDByteArr = (byte[]) attrs.get("objectGUID").get();

我收到以下异常

java.lang.ClassCastException: java.lang.String cannot be cast to [B

如何解决此问题从objectGUID获取byte[]值?

3 个答案:

答案 0 :(得分:1)

似乎您的属性对象的实际类型为String

将String转换为字节数组并返回的正确方法:

import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttributes;
import java.io.UnsupportedEncodingException;
import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        Attributes as = new BasicAttributes("a1", "val1");
        try {
            String attribute = (String) Optional.ofNullable(as.get("a1"))
                    .orElseThrow(() -> new IllegalArgumentException("No such attribute"))
                    .get();
            byte[] objGUIDByteArr = attribute.getBytes("UTF-8");
            System.out.println(new String(objGUIDByteArr));
        } catch (UnsupportedEncodingException | NamingException e) {
            e.printStackTrace();
        }
    }
}

输出:

val1

根据文档,您可以获得null,因此我应该添加空值处理以避免NPE(这就是为什么我添加Optional以便从java 8开始进行额外检查的原因):

/**
  * Retrieves the attribute with the given attribute id from the
  * attribute set.
  *
  * @param attrID The non-null id of the attribute to retrieve.
  *           If this attribute set ignores the character
  *           case of its attribute ids, the case of attrID
  *           is ignored.
  * @return The attribute identified by attrID; null if not found.
  * @see #put
  * @see #remove
  */
Attribute get(String attrID);

答案 1 :(得分:1)

此异常表示属性实例的值不是GUID。这可能是由于AD的多个问题(与其他LDAP目录服务同步期间的错误)而发生的。 只需使用try/catch来解决此问题。

答案 2 :(得分:1)

我们必须传递一个基础环境属性,让spring LDAP知道必须以O(1)格式而不是默认的LCA(i, j)格式返回objectGUID