0

私は小さなコース合格プロジェクトに取り組んでいますが、問題があります。

manager.xhtml は JSF ページであり、データベースからのデータの表示、並べ替え、フィルタリング、エントリの削除、およびそれらのエントリの編集に使用されます。Manager.java で @ViewScoped を使用している場合、編集部分を除くすべてが正常に動作します。「編集」リンクは、ユーザーを別のページ (edit.xhtml) に送ります。@ConversationScoped を使用して、manager.xhml から送信されたデータを edit.xhtml で読み取れるようにした後。@ConversationScoped を使用した後、エントリ編集オプションは問題なく機能しましたが、一部のフィルタリング/並べ替えオプションでエラーが発生し始めました.CATEGORYで並べ替えると、「名前がnullです」などのエラーが発生し始め、価格でフィルタリングします.同じ.

これがコードです。

manager.xhtml

@ConversationScoped を使用しているときに問題が発生し始めるフォームは次のとおりです

    <h:form>

        <h:panelGrid id="filterPanel" columns="7">
            <f:ajax render="filterValue" event="change" execute="filterValue">
                #{text.sort}
                <h:selectOneMenu value="#{manager.order}">
                    <f:selectItem itemValue="cargoName" itemLabel="#{text.cargo_name}"/>
                    <f:selectItem itemValue="price" itemLabel="#{text.cargo_price}"/>
                    <f:selectItem itemValue="category" itemLabel="#{text.cargo_category}"/>
                </h:selectOneMenu>


                <h:selectOneMenu id="filterType" value="#{manager.filterType}"> 

                    <f:selectItem itemValue="CARGO_NAME" itemLabel="#{text.cargo_name}"/>
                    <f:selectItem itemValue="PRICE" itemLabel="#{text.cargo_price_filter}"/>
                    <f:selectItem itemValue="CATEGORY" itemLabel="#{text.cargo_category}"/>
                </h:selectOneMenu>

                <h:panelGroup id="filterValue">
                    <h:panelGroup id="filterValues">
                        <h:inputText id="filterValueInput" value="#{manager.filterValue}" rendered="#{manager.filterType == 'CARGO_NAME'
                                                                    or manager.filterType == 'PRICE'}"
                                     required="#{manager.filterType == 'PRICE'}"/>
                        <h:message for="filterValueInput"/>
                        <h:inputText id="filterValueInput2" value="#{manager.filterValue2}" rendered="#{manager.filterType == 'PRICE'}" 
                                     required="#{manager.filterType == 'PRICE'}"/>
                        <h:message for="filterValueInput2"/>

                    </h:panelGroup>
                    <h:selectOneMenu id="cargoForm" value="#{manager.filterValue}" rendered="#{manager.filterType == 'CATEGORY'}">
                        <f:selectItem itemLabel="#{text.cargo_text_BOOKS}" itemValue="BOOKS"/>
                        <f:selectItem itemLabel="#{text.cargo_text_CALENDARS}" itemValue="CALENDARS"/>
                        <f:selectItem itemLabel="#{text.cargo_text_CD}" itemValue="CD"/>
                        <f:selectItem itemLabel="#{text.cargo_text_EBOOKS}" itemValue="EBOOKS"/>
                        <f:selectItem itemLabel="#{text.cargo_text_OFFICE}" itemValue="OFFICE"/>
                        <f:selectItem itemLabel="#{text.cargo_text_VINYL}" itemValue="VINYL"/>
                    </h:selectOneMenu>
                </h:panelGroup>

            </f:ajax>

            <h:commandButton action="#{manager.filter}" value="#{text.button_refresh}"/>
            <h:commandButton action="#{manager.reset}" value="#{text.button_reset}"/>
        </h:panelGrid>

edit.xhtml

編集フォーム - @ConversationScoped を使用する場合にのみ、選択したエントリのデータが入力されます。

manager.xhtml から送信された ID を取得する

        <h:inputHidden value="#{manager.editCargo.id}"/> 

フォームでは、データは次のようにマネージャーから取得されます。

            <h:inputText id="cargoName" value="#{manager.editCargo.cargoName}" required="true">
            </h:inputText>

変更を保存するボタン:

        <h:commandButton value="#{text.edit_button}" action="#{manager.update}"/>

Manager.java - 不要なコードが削除されました。

@ConversationScoped
@ManagedBean
public class Manager implements Serializable {

@Inject
private CargoRepository repository; // tworzy nową instancję objektu CargoRepository
private List<Cargo> cargos; // tworzy listę obiektów Cargo
private String order = CARGO_NAME; // musi istnieć by zainicjować jakąś zmienną order, ponieważ manager.xhtml już na starcie sortuje po order więc nie może być null.
private FilterType filterType = FilterType.CARGO_NAME;
private String filterValue;
private String filterValue2;

@Inject
private Conversation conversation;

ゲッターとセッターが削除されました...

@PostConstruct
public void init() {
    cargos = repository.getAll(order);
    editCargo = new Cargo();
}

public void filter() {
    if (filterType == FilterType.PRICE) {
        cargos = repository.getAll(filterType, filterValue, filterValue2, order);
    } else {
        cargos = repository.getAll(filterType, filterValue, order);
    }
}

public void resetFilterValue() {
    filterValue = "";
    filterValue2 = "";
}

public String edit(Cargo cargo) {
    conversation.start();
    editCargo = cargo;
    return "edit";
}

public String update() {
    conversation.end();
    repository.update(editCargo);
    System.out.println(editCargo.toString());
    init();
    return "manager";
}

}

4

1 に答える 1

0

問題を修復することができました。

それ以外の:

@ConversationScoped
@ManagedBean

利用した

@Named
@SessionScoped

@SessionScoped はからインポートされました

import javax.enterprise.context.SessionScoped;

@ConversationScoped を含むすべてに関連するものを削除しました

@Inject
private Conversation conversation;

とのすべての使用法

conversation.start();
conversation.end();

現在、すべてが問題なく機能しています。

于 2014-09-17T11:21:44.697 に答える