如何修复异常 java.lang.ClassCastException:从 AD 获取 objctGUID 时无法将 java.lang.String 转换为 [B?
How to fix the exception java.lang.ClassCastException: java.lang.String cannot be cast to [B while getting the objctGUID from AD?
我正在尝试从 windows AD 获取唯一标识符。但是在下面的代码行:
byte[] objGUIDByteArr = (byte[]) attrs.get("objectGUID").get();
我收到以下异常
java.lang.ClassCastException: java.lang.String cannot be cast to [B
如何解决此问题并从 objectGUID 获取 byte[]
值?
您的属性对象的实际类型似乎是 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);
此异常意味着属性实例具有 GUID 以外的值。这可能是由于 AD 的多个问题(与其他 LDAP 目录服务同步期间的错误)所致。
只需使用 try/catch
即可解决此问题。
我们必须传递一个基础环境 属性 让 spring LDAP 知道 objectGUID
必须以 java.naming.ldap.attributes.binary
格式而不是默认的 String
格式返回]格式。
我正在尝试从 windows AD 获取唯一标识符。但是在下面的代码行:
byte[] objGUIDByteArr = (byte[]) attrs.get("objectGUID").get();
我收到以下异常
java.lang.ClassCastException: java.lang.String cannot be cast to [B
如何解决此问题并从 objectGUID 获取 byte[]
值?
您的属性对象的实际类型似乎是 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);
此异常意味着属性实例具有 GUID 以外的值。这可能是由于 AD 的多个问题(与其他 LDAP 目录服务同步期间的错误)所致。
只需使用 try/catch
即可解决此问题。
我们必须传递一个基础环境 属性 让 spring LDAP 知道 objectGUID
必须以 java.naming.ldap.attributes.binary
格式而不是默认的 String
格式返回]格式。