我们可以在azure ad的过滤器中使用startswith作为businessPhones吗

问题描述 投票:0回答:1

我正在学习 Azure 用户课程。在属性businessPhones的用户类中,我看到如下评论

/**
 * The Business Phones.
 * The telephone numbers for the user. NOTE: Although this is a string collection, only one number can be set for this property. Read-only for users synced from on-premises directory. Returned by default. Supports $filter (eq, not, ge, le, startsWith).
 */
@SerializedName(value = "businessPhones", alternate = {"BusinessPhones"})
@Expose
@Nullable
public java.util.List<String> businessPhones;

评论中的这句话提到我们可以在businessPhones列上使用startsWith。但是当我尝试使用startswith时出现以下错误。

enter image description here

还尝试了另一种方式,就像我们用于字符串的方式一样,如下所示。但还是报错

enter image description here

我们只能对 String 类型使用startsWith吗?我们不能将startswith 用于商务电话吗?

也浏览过此链接 在 Microsoft Graph 中按手机或商务手机筛选用户

我问这个问题的原因是我有一个方法,可以使用传递给该方法的搜索字段动态构建我的搜索查询。搜索字段是来自 azure 用户对象的属性

我的搜索字段如下

azure.user.attributes=givenName,displayName,surname,mail,userPrincipalName,onPremisesSamAccountName,jobTitle,mobilePhone,officeLocation,preferredLanguage,businessPhones

我的代码如下

private String getFilterQuery(SearchCriteria searchCriteria) {
    StringBuilder filterQuery = new StringBuilder();
    List<String> searchFields = searchCriteria.getSearchFields();
    if (searchFields.size() > 0) {
        for (String searchField : searchFields) {
            filterQuery.append("startswith(");
            filterQuery.append(searchField);
            filterQuery.append(",");
            filterQuery.append("'");
            filterQuery.append(searchCriteria.getSearchText());
            filterQuery.append("')");
            filterQuery.append(" or ");
        }
        return (filterQuery.lastIndexOf(" or ") > -1)
                ? filterQuery.substring(0, filterQuery.lastIndexOf(" or ")).toString()
                : filterQuery.toString();
    }
}

SearchCriteria 是我的自定义对象,如下

    public class SearchCriteria {

private List<String> searchFields = new ArrayList<>();
private String searchText;

public String getSearchText() {
    return searchText;
}

public void setSearchText(String searchText) {
    this.searchText = searchText;
}

public List<String> getSearchFields() {
    return searchFields;
}

public void setSearchFields(List<String> searchFields) {
    this.searchFields = searchFields;
}

最后查询是这样的

"startswith(givenName,'" + searchCriteria.getSearchText() + "') " + " or startswith(mail,'"
                + searchCriteria.getSearchText() + "') " + "    or startswith(surname,'" + searchCriteria.getSearchText()
                + "') " + " or startswith(displayName,'" + searchCriteria.getSearchText() + "') "
                + " or startswith(userPrincipalName,'" + searchCriteria.getSearchText() + "') "
                + " or startswith(onPremisesSamAccountName,'" + searchCriteria.getSearchText() + "')";

当businessPhones是属性的一部分并且上面的查询包含像这样的businessPhones时,它会失败

or startswith(businessPhones,'" + searchCriteria.getSearchText() + "'

当包含 BusinessPhones 时,我是否应该为该特定字段构建不同的查询。

有人写了一篇博客,我在评论部分提到过。尝试了博客中提到的方法,但没有成功。

出现以下错误

enter image description here

生成的查询是这样的

https://graph.microsoft.com/v1.0/users?$filter=any(t: businessPhones : startswith(t, 'avi')) or startswith(givenName,'avi') or startswith(displayName,'avi') or startswith(surname,'avi') or startswith(mail,'avi') or startswith(userPrincipalName,'avi') or startswith(onPremisesSamAccountName,'avi') or startswith(jobTitle,'avi') or startswith(mobilePhone,'avi') or startswith(officeLocation,'avi') or startswith(preferredLanguage,'avi')&$count=true

唯一的工作方式就是这样

enter image description here

有任何帮助/建议请

azure azure-active-directory azure-sdk azure-sdk-for-java
1个回答
0
投票

注意:

businessPhone
属性的类型是字符串的集合,它像数组一样存储值。请参阅此MsDoc

当我尝试在我的环境中重现相同的情况时,我注册了一个用户,如下所示:

门户用户刀片:

enter image description here

我使用下面的命令来获取该用户,但我得到了相同的输出:

GET https://graph.microsoft.com/v1.0/users?$filter=businessPhones/any(x: startswith(x,'a'))&$count=true

回应:

enter image description here

要解决此错误,需要确保

businessPhone
值必须以“a”开头才能使用
$filter(startsWith)

门户用户刀片:

enter image description here

GET https://graph.microsoft.com/v1.0/users?$filter=businessPhones/any(x: startswith(x,'a'))&$count=true

回复: enter image description here

参考:

商务电话

© www.soinside.com 2019 - 2024. All rights reserved.