Java 将DirectoryObject转换为用户

Java 将DirectoryObject转换为用户,java,azure-active-directory,microsoft-graph-api,microsoft-graph-sdks,Java,Azure Active Directory,Microsoft Graph Api,Microsoft Graph Sdks,给定一个特定目录角色成员的查询,我想返回相应用户的列表。我所拥有的是: IDirectoryObjectCollectionWithReferencesRequest request = graphServiceClient.directoryRoles(roleId).members().buildRequest(); IDirectoryObjectCollectionWithReferencesPage page = request.select(USER_FIELDS_TO_RETURN

给定一个特定目录角色成员的查询,我想返回相应用户的列表。我所拥有的是:

IDirectoryObjectCollectionWithReferencesRequest request = graphServiceClient.directoryRoles(roleId).members().buildRequest();
IDirectoryObjectCollectionWithReferencesPage page = request.select(USER_FIELDS_TO_RETURN).get();
List<DirectoryObject> objects = page.getCurrentPage();
IDirectoryObjectCollectionWithReferencesRequestBuilder builder = page.getNextPage();
while (builder != null) {
    request = builder.buildRequest();
    page = request.select(USER_FIELDS_TO_RETURN).get();
    objects.addAll(page.getCurrentPage());
    builder = page.getNextPage();
}
return objects.stream().filter(o -> o.oDataType.equals("#microsoft.graph.user")).map(o -> new User()).collect(Collectors.toList());

将DirectoryObject转换为用户的正确方法是什么Microsoft Graph目前不支持此要求

如果您正在检查特定的directoryRole,您可以从另一个方向进行检查。/members终结点不支持按成员id进行筛选:

v1.0/directoryRoles/{role-id}/members?$filter=id eq '{user-id}'

请检查此线程中提供的答案和解决方法

我知道这是个老问题,但我也遇到了同样的问题,找到了更好的解决方案

您可以在拥有列表后将其转换为用户。因此,如果您正在迭代列表:

var myDirectoryList = (List<DirectoryObject>)myRetrievedList;
foreach(var item in myDirectoryList)
{
    var myUser = (User)item;
    Console.WriteLine($"My name is {myUser.GivenName}");
}
var myDirectoryList=(List)myRetrievedList;
foreach(myDirectoryList中的变量项)
{
var myUser=(用户)项;
WriteLine($“我的名字是{myUser.GivenName}”);
}

其中DirectoryObject是Microsoft.Graph.DirectoryObject,User是Microsoft.Graph.User.

也有同样的问题,因此,对于任何人来说,下面是我所做的(我找不到任何其他简单的解决方案…)

您所谓的“一些奇怪的序列化/反序列化逻辑”实际上可以通过使用DefaultSerializer这样做:

private ISerializer serializer = new DefaultSerializer(new DefaultLogger());
...
objects.stream().filter(o -> o.oDataType.equals("#microsoft.graph.user")).map(o -> {
    return serializer.deserializeObject(o.getRawObject().toString(), User.class)
}).collect(Collectors.toList());

问题在于将数据强制转换到特定对象。返回值是DirectoryObject,它包含我需要的内容。但是,为了使DirectoryObject成为用户对象,必须获取原始值的字符串并将其序列化为用户对象。在一个巨大的数据集上执行此操作并不特别便宜。是否有不同的方法将用户对象从DirectoryObject中取出?或者更好的问题是;能否指示sdk返回用户对象形状而不是DirectoryObject形状?大致如下:graphServiceClient.directoryRoles(roleId.members(User.class.buildRequest())
private ISerializer serializer = new DefaultSerializer(new DefaultLogger());
...
objects.stream().filter(o -> o.oDataType.equals("#microsoft.graph.user")).map(o -> {
    return serializer.deserializeObject(o.getRawObject().toString(), User.class)
}).collect(Collectors.toList());