0

我正在做一个小课程通过项目,我有一个问题。

manager.xhtml 是一个 JSF 页面,它用于查看数据库中的数据,对它们进行排序、过滤、删除条目和编辑这些条目。当我在 Manager.java 中使用 @ViewScoped 时 - 除了编辑部分之外的所有内容都可以正常工作。“编辑”链接将用户发送到另一个页面 - edit.xhtml。在我使用@ConversationScoped 能够读取从edit.xhtml 中的manager.xhml 发送的数据之后。使用@ConversationScoped 后,条目编辑选项完美运行,但它开始在某些过滤/排序选项中出错 - 按类别排序开始提取错误,如“名称为空”,按价格过滤 - 相同。

这是代码。

管理器.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>

编辑.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 回答