如何修复JSF请求范围的CDI Bean



我是JSF的新手,我正在与一个JPA实体一起从事一个小型项目,但是今天在项目上工作,我有几个疑问和一些问题。我对JSF的所有知识是从书籍中。

问题是:

当我单击列表全按钮时,列表会加载正常并显示我在DB中的数据,但是当我单击一行列中的删除按钮时,它无能为力,似乎像刷新页面。如果我将Bean的范围更改为SessionsCope,则可以正常工作。我阅读的大多数书都显示了带有RequestScope的Crud操作的示例,其他一些互联网文章则显示了相同的示例。

创建和更新操作以另一种XHTML页面(crearbeneficiario.xhtml和eactleizarbeneficiario.xhtml(中的另一种形式处理的创建和更新操作。

我在Payara服务器上使用JSF 2.3 5.192和Eclipse IDE 4.12

如果您能带领我走上正确的道路,我将非常感谢。

我附上一些图像图片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 );
    }

答案就像@kukeltje说

通过在请求和会话之间使用SOPE:ViewScoped中的SOPE仍然可以使用它。非常适合这个

最新更新