JSF2: ограничение атрибута cc: указанным типом объекта в списке - PullRequest
4 голосов
/ 25 июня 2010

Если бы у меня был управляемый бин следующим образом:

@ManagedBean
@RequestSchoped
public class Example {

    private List<String> stringList;
    private List<Long> longList;

    // getters, setters, etc. down here
}

и имел пользовательский компонент, который принимал список в качестве атрибута:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:cc="http://java.sun.com/jsf/composite"
      xmlns:h="http://java.sun.com/jsf/html">

  <!-- INTERFACE -->
  <cc:interface>
      <cc:attribute name="aList" type="java.util.List" />
  </cc:interface>

  <cc:implementation>
      <!-- code is in here -->
  </cc:implementation>
</html>

Как я мог убедиться, что это сработало:

<myComp:previousComponent aList="#{example.stringList}" />

но это не так:

<myComp:previousComponent aList="#{example.longList}" />

Другими словами, я хочу сделать для cc:attribute следующее:

<cc:attribute name="aList" type="java.util.List<java.lang.String>" />

Однако, как мы знаем, xhtml не любит использовать> или <. Кроме того, поскольку Generics проверяется только во время компиляции, я не уверен, как это будет сделано. Кто-нибудь знает, возможно ли это? </p>

Ответы [ 2 ]

3 голосов
/ 12 августа 2010

Вы можете проверить тип каждого элемента, используя #{item.class.name}.Class#getName() возвращает String, обозначающий тип.Например, java.lang.String или java.lang.Long.Его можно использовать в атрибуте rendered.

Добавить дополнительный атрибут, обозначающий полное имя класса.

<my:comp list="#{bean.list}" type="java.lang.String" />

в сочетании с

<cc:attribute name="list" type="java.util.List" required="true" />
<cc:attribute name="type" type="java.util.String" required="true" />

и эта логика в cc:implementation:

<ul>
    <ui:repeat value="#{cc.attrs.list}" var="item">
        <h:panelGroup rendered="#{item.class.name == cc.attrs.type}">
            <li>#{item}</li>
        </h:panelGroup>
    </ui:repeat>
</ul>    
3 голосов
/ 31 июля 2010

Если вы создаете эти списки, то тривиальное решение может быть следующим:

interface StringList extends List<String> {}

class ArrayStringList extends ArrayList<String> implements StringList {}

Не слишком элегантно.язык здесь.Я столкнулся с той же проблемой и не смог найти лучшего решения ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...