为什么 primefaces 自动完成不适用于包含引号 ' 的字符串?

Why primefaces auto complete doesnot working on String containing quotes '?

自动完成方法成功显示了用户名的字符串列表,但没有将其添加到所选用户。我尝试并搜索了很多,请帮助我。

xhtml 文件

...
...
            <div class="ui-sm-12 ui-md-2 ui-lg-2">
                <p:outputLabel  value="Users" />
            </div>
            <div class="ui-sm-12 ui-md-4 ui-lg-4">   
                <h:inputHidden value="#{service.usersListSize}" id="iTUsers" />

                <p:autoComplete id="usersid" widgetVar="userswVar" maxlength="60" minQueryLength="1"  
                                maxResults="10" styleClass="actCont" style="width: 100%;height:50px;"  
                                value="#{service.users}"
                                completeMethod="#{service.completeUserName}" var="u" unique="true"
                                itemLabel="#{u}" itemValue="#{u}" multiple="true"  forceSelection="true" disabled="#{service.disableFields}">
                    <p:ajax event="itemSelect"  listener="#{service.getListValues()}"  update="jbForm:tabview:iTUsers"/>

                </p:autoComplete>
            </div>
...
...

Service.java 文件

....
....

    private int usersListSize;
    private List<String> users = new ArrayList<>();

    public int getUsersListSize() {
        return usersListSize;
    }

    public void setUsersListSize(int usersListSize) {
        this.usersListSize = usersListSize;
    }

    public List<String> getUsers() {
        return users;
    }

    public void setUsers(List<String> users) {
        this.users = users;
    }

    public List<String> completeUerName(String query) {
        if (!query.startsWith("@")) {
            return new ArrayList<>();
        }
        String queryLowerCase = query.toLowerCase();
        List<String> uName = getListOfUsersName();

        return uName.stream().filter(t -> t.toLowerCase().contains(queryLowerCase)).collect(Collectors.toList());
    }

 
    public List<String> getListOfUsersName() {
        List<String> usersNamesList;
        usersNamesList.add("jhon");
        usersNamesList.add("jhonny");
        usersNamesList.add("Richard D'souza");
        usersNamesList.add("sheri'f");
        usersNamesList.add("ja'mes");
        List<String> userNameList = new ArrayList<>();
        for (String u : usersNamesList) {
            userNameList.add("@" + u);
        }
        return userNameList.stream().filter(t -> t.toLowerCase().contains("@")).collect(Collectors.toList());
    }

    public void getListValues() {
        setUsersListSize(this.users.size());
    }

    
    public void listUsers(Integer id) {
        users = retrieveUsersLst(id);
    }

    public List<String> retrieveUsersLst(Integer id) {

        List<String> ppList = new ArrayList<>();
        List<Users> userList = usersList(id);
        if (userList != null && !userList .isEmpty()) {
            int listSize = userList .size();
            String userName;
            for (int i = 0; i < listSize; i++) {
                userName = "@" + getUserName(userList .get(i).getId());
                ppList.add(userName);
            }
        }
        return ppList;
    }

  
    public List<Users> usersList(Integer id) {
        String queryString = "from Users where id=" + id;
        return dao.qryList(queryString, Dao.query.HQL);
    }

    public String getUserName(Integer uId) {
        String queryString = "select userName from Users where id=" + uId;
        return (String) dao.qryUniqueResult(queryString, Dao.query.HQL);
    }

它工作正常,除非用户名包含任何引号 Like this ' 那么该值未被选择。我不知道为什么。 请帮我解决这个问题。提前致谢。 使用素面 6.2.

问题在于 PF 6.2 中如何管理自动完成的唯一属性。 如您所见,在任何浏览器开发人员工具中,单击包含 ' 字符的项目都会产生错误,如下所示:

Uncaught Error: Syntax error, unrecognized expression: li[data-token-value='@Richard D'souza']

components.js中的错误是:

PrimeFaces.widget.AutoComplete
...
h = PrimeFaces.escapeHTML(e.replace(/\"/g, '\''));
...
if (a.cfg.multiple) {
        var j = false;
        if (a.cfg.unique) {
          j = a.multiItemContainer.children('li[data-token-value=\'' + h + '\']').length != 0
    }

请注意,如果您键入整个字符串,则不会出现错误,并且会添加该项目。 这已在较新的 PF 版本中解决:

 PrimeFaces.widget.AutoComplete
    ...
      var i = f.attr("data-item-value");
    ...
         if (a.cfg.multiple) {
             var h = false;
             if (a.cfg.unique) {
                 h = a.multiItemContainer.children("li[data-token-value='" + $.escapeSelector(i) + "']").length != 0
             }

作为解决方案,您可以:

  1. 升级PF, >= 7.0
  2. 删除唯一属性,如果您的用例不需要它,或者在选择事件(服务器端)管理它
  3. 覆盖该函数,在 PF 6.2 中添加转义逻辑