如何解决异常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值?
答
我们必须通过一个基本环境属性让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
来解决这个问题。
什么是attrs? –
'javax.naming.directory.Attributes' – Shiva