如何解决异常java.lang.ClassCastException:在从AD获取objctGUID时,java.lang.String不能转换为[B?

问题描述:

我试图从Windows AD中获取唯一标识符。但在下面的代码行:如何解决异常java.lang.ClassCastException:在从AD获取objctGUID时,java.lang.String不能转换为[B?

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

我得到以下异常

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

如何解决这个&得到byte[]从的objectGUID值?

+0

什么是attrs? –

+0

'javax.naming.directory.Attributes' – Shiva

我们必须通过一个基本环境属性让spring LDAP知道objectGUID必须以java.naming.ldap.attributes.binary格式而不是默认的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); 
+0

Thanx的答复。将其转换为字符串将更改字节格式中的byte []值,并因此更改最终的'objectGUID'值。 – Shiva

此异常意味着属性实例的值不是GUID。由于AD存在多个问题(与其他LDAP目录服务同步期间发生错误),可能会发生这种情况。 只需使用try/catch来解决这个问题。