Как получить доступ к компоненту шва, который был создан во время установки значения параметра? - PullRequest
0 голосов
/ 28 декабря 2011

Мой URL имеет имя параметра = SSA-COLUMB.Параметр seam (установленный в DevicesList.page.xml) равен

<param name="name" value="#{searchDeviceName.paramValue}"/>

Когда я загружаю страницу, создается экземпляр компонента searchDeviceName и устанавливается paramValue.Я проверил это с помощью инструкции print для setParamValue ().Вот код для SearchDeviceName.java

@Name("searchDeviceName")
@Scope(ScopeType.CONVERSATION)
public class SearchDeviceName {

    public String paramValue;
    public Table table;
    public String sqlString;
    public ArrayList<JoinClause> joinList;

    public SearchDeviceName() {
        Table devTable = new Table("devices","d","dev_id");
        setTable(devTable); 
        setSqlString(" d.name like '%"+paramValue+"%'");
    }

    <getters and setters>

}

У меня есть сеансный компонент без сохранения состояния, который захватывает экземпляр этого компонента для использования при построении оператора SQL.Но когда я беру экземпляр компонента, для него не устанавливается paramValue.По-видимому, это новый экземпляр компонента.

SearchDeviceName searchObj = (SearchDeviceName) Component.getInstance("searchDeviceName", ScopeType.CONVERSATION);

Это не тот экземпляр searchDeviceName, который был создан при установке значения параметра.Я знаю это, потому что paramValue имеет значение null, а не "SSA-COLUMB".

Есть ли способ использовать в моем сессионном компоненте тот же компонентный intance, который был создан при установке значения параметра?Как мне получить это?

Вот код, который захватывает компонент

@Name("idListBuilder")
public class IdListBuilder {

    @In
    private Context conversationContext;

    @In(create = true)
    EntityManager entityManager;

    private String sqlQuery;
    private Table headTable;

    private ArrayList<String> restrictionValues = new ArrayList<String>();
    private ArrayList<Table> restrictionJoinTables  = new ArrayList<Table>();

    public IdListBuilder(Table table) {
        this.headTable = table;
        this.sqlQuery = "SELECT " + table.alias + "." + table.primaryKey + " FROM " +
                table.name + " " + table.alias;
        searchObjects.add("searchDeviceName");
        searchObjects.add("searchOfficeState");  
    }

    public List<Integer> getIdList(){
        evaluateSearchObjects();
        createQuery();
        /*
        Code for grabbing resultlist of query goes here.
        return resultList;
        */
        return null;
    }

    public void evaluateSearchObjects() {
            SearchDeviceName searchObj = (SearchDeviceName) Component.getInstance("searchDeviceName", ScopeType.CONVERSATION);
            if ( searchObj != null ) {
                restrictionValues.add(searchObj.sqlString);
                restrictionJoinTables.add(searchObj.table);
            }
    }

    void createQuery(){
        StringBuilder strBuilder = new StringBuilder(sqlQuery);
        strBuilder.append(" where ");
        for ( String str : restrictionValues ){
            strBuilder.append(str);
        }
        System.out.println("done");
    }

}

Ответы [ 2 ]

0 голосов
/ 09 января 2012

Подтвердили ли вы, что setParamValue () вызывается до valuSearchObjects ()?

Что вызывает IdListBuilder.getIdList ()? Возможно, это происходит раньше в жизненном цикле JSF, что setParamValue ().

0 голосов
/ 31 декабря 2011

Я не уверен на 100%, но, возможно, контекстные события - путь.

Взгляните на эту ссылку

Может быть, вы можете прослушать событие

   org.jboss.seam.preSetVariable.<name> // called when the context variable <name> is s et
   org.jboss.seam.postSetVariable.<name> // called when the context variable <name> is set


   @Observer("org.jboss.seam.postSetVariable.YOUR_COMPONENT")
   public void method() {
      //Maybe you need to retrieve the correct object as parameter also,look at the documentation
   }
...