Reputation: 3
I'm working with Microsoft Graph API to get users from my organisation. Here's what I have so far that fetches all users:
TokenCredentialAuthProvider authProvider = new TokenCredentialAuthProvider(
Collections.singletonList("https://graph.microsoft.com/.default"),
clientSecretCredential
);
GraphServiceClient<Request> graphClient = GraphServiceClient
.builder()
.authenticationProvider(authProvider)
.buildClient();
List<User> allUsers = new LinkedList<>();
var usersPage = graphClient.users()
.buildRequest()
.get();
while (usersPage != null) {
usersPage.getCurrentPage().forEach(allUsers::add);
usersPage = usersPage.getNextPage() != null ?
usersPage.getNextPage().buildRequest().get() : null;
}
allUsers.forEach(user ->
System.out.println("User: " + user.displayName + " | ID: " + user.id)
);
Now, I need to filter these users to retrieve only those associated with my company name, like "XiaoZCorp" with filter like this:
var usersPage = graphClient.users()
.buildRequest()
.filter("companyName eq 'XiaoZCorp'") // This line throws an error
.get();
However, I’m getting this error:
java: cannot find symbol
symbol: method filter(java.lang.String)
location: class com.microsoft.graph.requests.UserCollectionRequestBuilder
How can I properly filter users by company name using Microsoft Graph API in Java SDK?
Upvotes: 0
Views: 102
Reputation: 22222
Initially, I registered one application and granted User.Read.All
permission of Application type as below:
I have below users in Azure Portal with company name 'MSFT' in my case:
To get these user details using Microsoft Graph Java SDK, you can make use of below sample code:
package org.example;
import com.azure.identity.ClientSecretCredential;
import com.azure.identity.ClientSecretCredentialBuilder;
import com.microsoft.graph.authentication.TokenCredentialAuthProvider;
import com.microsoft.graph.requests.GraphServiceClient;
import com.microsoft.graph.requests.UserCollectionPage;
import com.microsoft.graph.requests.UserCollectionRequestBuilder;
import com.microsoft.graph.requests.UserCollectionRequest;
import com.microsoft.graph.options.QueryOption;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
String clientId = "appId";
String clientSecret = "secret";
String tenantId = "tenantId";
ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
.clientId(clientId)
.clientSecret(clientSecret)
.tenantId(tenantId)
.build();
TokenCredentialAuthProvider authProvider = new TokenCredentialAuthProvider(
Collections.singletonList("https://graph.microsoft.com/.default"),
clientSecretCredential
);
GraphServiceClient graphClient = GraphServiceClient
.builder()
.authenticationProvider(authProvider)
.buildClient();
UserCollectionRequestBuilder requestBuilder = graphClient.users();
UserCollectionRequest request = requestBuilder
.buildRequest()
.select("companyName,id,displayName")
.filter("companyName eq 'MSFT'");
// Add ConsistencyLevel header
request.addHeader("ConsistencyLevel", "Eventual");
// Add $count query parameter
request.addQueryOption(new QueryOption("$count", "true"));
UserCollectionPage result = request.get();
// Print out the filtered users
result.getCurrentPage().forEach(user ->
System.out.println("User: " + user.displayName + " | ID: " + user.id)
);
}
}
Response:
Make sure to add ConsistencyLevel : eventual
and $count:true
headers as filtering with company name requires advanced query capability.
Reference:
Use the $filter query parameter to filter a collection of objects - Microsoft Graph
Upvotes: 0