首页 > 解决方案 > 如何修复 JSF 请求范围的 CDI Bean

问题描述

我是 JSF 的新手,我正在使用一个 JPA 实体开展一个小项目,但今天在开展该项目时我有几个疑问和一些问题。我对 JSF 的所有知识都来自书本。

问题如下:

当我单击列表所有按钮时,列表加载正常并显示我在数据库中的数据,但是当我单击行列中的删除按钮时,它什么也不做,似乎刷新页面。如果我将 bean 的范围更改为 SessionScope 它工作正常。我阅读的大多数书籍都展示了使用 RequestScope 进行 CRUD 操作的示例,而其他一些互联网文章也展示了相同的示例。

创建和更新操作在另一个 xhtml 页面(crearBeneficiario.xhtml 和actualizarBeneficiario.xhtml)中以另一种形式处理并且工作正常。

我在 Payara Server 5.192 和 Eclipse IDE 4.12 上使用 JSF 2.3

如果您能带领我走上正确的道路,我将不胜感激。

我附上一些图片 图片 1 删除前点击 图片 2 删除后点击

在我的 listarBeneficiario.xhtml(部分代码)中,我必须遵循表单和数据表

<h:form>
    <button type="submit" class="btn btn-block btn-sm" jsf:action="#{navigationController.goCrearBeneficiario()}">Nuevo beneficiario</button>
    <hr />

    <button type="submit" class="btn btn-block btn-sm" jsf:action="#{beneficiarioController.listBeneficiariosTodos()}">Listar Todos</button>
    <hr />
</h:form>

<h:form>
<h:dataTable value="#{beneficiarioController.beneficiarios}" var="b" styleClass="table table-hover"headerClass="verderuralp-color white-text">
    <h:column>
        <f:facet name="header">Nombre</f:facet>
        <h:outputText value="#{b.nombre}" />
    </h:column>

    <h:column>
        <f:facet name="header">A. Paterno</f:facet>
        <h:outputText value="#{b.apellidoPaterno}" />
    </h:column>

    <h:column>
        <f:facet name="header">A. Materno</f:facet>
        <h:outputText value="#{b.apellidoMaterno}" />
    </h:column>

    <h:column>
        <f:facet name="header">CURP</f:facet>
        <h:outputText value="#{b.curp}" />
    </h:column>

    <h:column>
        <h:commandButton action="#{beneficiarioController.deleteBeneficiario(b.beneficiarioId)}" value="Eliminar"/>
    </h:column>
</h:form>

这是我的 CDI Bean(部分代码)

@Data
@NoArgsConstructor
@Named
@RequestScoped
public class BeneficiarioController
    implements Serializable
{
    private static final long serialVersionUID = 1L;
    private String mensaje;
    private String desde;
    private String hasta;
    private String busqueda;
    private BeneficiarioDto beneficiarioDto = new BeneficiarioDto();
    private List<Beneficiario> beneficiarios = new ArrayList<Beneficiario>();

    @EJB
    private BeneficiarioService beneficiarioService;
    public void deleteBeneficiario( Beneficiario b ) {
        try {
            beneficiarioService.deleteBeneficiario( b.getBeneficiarioId() );
            mensaje = "El beneficiario fue dado de baja";
        } catch ( EntidadNoEncontrada e ) {
            mensaje = e.getMessage();
        }
        beneficiarios = beneficiarioService.listBeneficiariosPorEstado( true );
    }

    public void listBeneficiariosTodos() {
        this.beneficiarios = beneficiarioService.listBeneficiariosPorEstado( true );
    }

标签: jsf

解决方案


答案就像@Kukeltje 说的

通过在请求和会话之间使用 sope 仍然可以按照您的方式使用它:viewscoped。非常适合这个


推荐阅读