Java + JSF - 在 bean 中构造 array/list 方法时出错,结合了 2 个参数

Java + JSF - Error in constructing array/list method in beans, with 2 parameters combined

大家晚安。我是 Java 的初学者,非常基础(我还在学习这门语言)。我正在构建一个针对汽车修理厂的应用程序;它必须管理车辆维护数据。我在最开始,从项目的一小部分开始试验,逐渐扩展和学习。我正在使用我在大学学到的旧 JDBC(我仍然必须了解 JPA + Hibernate,仍然很原始)。我将 Eclipse 2020 与 Maven、Java 8、JSF 2.2、BD MySql 和前面的 Primefaces 一起使用。

改编另一个项目的一部分,我在 Java 课程中学习过,该项目运行良好,在成功填充数据 Table 后使用“select * 来自 ORDSERV”语句一个正常工作的 prepareStatement,从数据库中提取所有记录,我想尝试使用 2 个标准交叉同一个数组,服务订单号 + 服务类别(“select * 来自 ORDSERV,其中 OSCTRL_NR_OS = ? AND CATEG_CD_CATEG =?") 在持久层和测试中一切正常,但在 Bean 中.. 事情变得疯狂了!

该项目没有运行。 Eclipse在页面上指出错误说我正在调用的方法不能被调用,因为它没有被标识为一个bean成员! (“searchOS 无法解析为 osb 的成员”)。

有人可以给我一盏灯吗??代码和错误堆栈如下。

我的母语是葡萄牙语,来自巴西。代码自然是用这种语言写的。

持久层:

package br.com.agoraeuquero.carrotop.repositorio;

import java.util.ArrayList;
import java.util.List;
import br.com.agoraeuquero.carrotop.modelo.ControleOS;
import br.com.agoraeuquero.carrotop.modelo.OrdemServico;


public class OrdemServicoDao extends Dao {

    
    // LISTAR TODAS AS ORDENS DE SERVICO
    
    public List<OrdemServico> listaTodasOS() throws Exception {
        open();
        stmt = con.prepareStatement("select * from ORDSERV");
        rs = stmt.executeQuery();
        List<OrdemServico> lista = new ArrayList<OrdemServico>();
        while (rs.next()) {
            OrdemServico os = new OrdemServico(rs.getInt(1), rs.getInt(2), rs.getString(3), rs.getString(4),
                    rs.getString(5), rs.getString(6), rs.getString(7), rs.getDate(8), rs.getDate(9), rs.getString(10),
                    rs.getString(11), rs.getString(12), rs.getString(13), rs.getString(14));
            lista.add(os);
        }
        close();
        return lista;
    }
    
    // LISTA AS ORDENS DE SERVIÇO CONFORME CRITERIOS DE PESQUISA
    
    public List<OrdemServico> pesquisaOS() throws Exception {
        open();
        Integer nrOrdemServico = 0;
        String categoria = null;
        
        stmt = con.prepareStatement("select * from ORDSERV where OSCTRL_NR_OS=? AND CATEG_CD_CATEG=?");
        stmt.setInt(1, nrOrdemServico);
        stmt.setString(2, categoria);
        rs = stmt.executeQuery();
        List<OrdemServico> lista = new ArrayList<OrdemServico>();
        while (rs.next()) {
            OrdemServico os = new OrdemServico(rs.getInt(1),rs.getInt(2),
            rs.getString(3), rs.getString(4),rs.getString(5),rs.getString(6),
            rs.getString(7),rs.getDate(8),rs.getDate(9),rs.getString(10),
            rs.getString(11),rs.getString(12),rs.getString(13),rs.getString(14));
            lista.add(os);
        }
        close();
        return lista;
    }
    
    
    
    // LISTA TODOS OS NUMEROS E DATAS DE ORDENS DE SERVIÇO
    
    public List<ControleOS> listaNrsOS() throws Exception {
        open();
        stmt = con.prepareStatement("select * from OSCTRL");
        rs = stmt.executeQuery();
        List<ControleOS> lista = new ArrayList<ControleOS>();
        while (rs.next()) {
            ControleOS cos = new ControleOS(rs.getInt(1), rs.getDate(2));
            lista.add(cos);
            
        }
        close();
        return lista;
    }

}

这里主要是Bean(控制层),这是中心问题。方法getlistaTodasOS()正常工作,问题是我需要做什么来更正方法getpesquisaOS .

package br.com.agoraeuquero.carrotop.controle;

import java.io.Serializable;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import br.com.agoraeuquero.carrotop.modelo.ControleOS;
import br.com.agoraeuquero.carrotop.modelo.OrdemServico;
import br.com.agoraeuquero.carrotop.repositorio.OrdemServicoDao;

@RequestScoped
@ManagedBean(name = "osb")
public class ServicoBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private OrdemServico ordemServico;
    private List<OrdemServico> ordemServicoLista;
    private ControleOS controleOS;
    private List<ControleOS> controleOSLista;
    HttpSession session;

    public ServicoBean() {
    }

    public OrdemServico getOrdemServico() {
        return ordemServico;
    }

    public ControleOS getControleOS() {
        return controleOS;
    }

    public void setControleOS(ControleOS controleOS) {
        this.controleOS = controleOS;
    }

    public List<ControleOS> getControleOSLista() {
        return controleOSLista;
    }

    public void setControleOSLista(List<ControleOS> controleOSLista) {
        this.controleOSLista = controleOSLista;
    }

    public void setOrdemServico(OrdemServico ordemServico) {
        this.ordemServico = ordemServico;
    }

    public List<OrdemServico> getOrdemServicoLista() {
        return ordemServicoLista;
    }

    public void setOrdemServicoLista(List<OrdemServico> ordemServicoLista) {
        this.ordemServicoLista = ordemServicoLista;
    }

    public HttpSession getSession() {
        return session;
    }

    public void setSession(HttpSession session) {
        this.session = session;
    }
    
    // LISTA TODAS AS ORDENS DE SERVIÇO

    public List<OrdemServico> getlistaTodasOS() {
        FacesContext fc = FacesContext.getCurrentInstance();
        try {
            ordemServicoLista = new OrdemServicoDao().listaTodasOS();
        } catch (Exception ex) {
            ex.printStackTrace();
            fc.addMessage(null, new FacesMessage("Erro :" + ex.getMessage()));
        }
        return ordemServicoLista;
    }
    
    // ## PRINCIPAL: PEDE 2 PARAMETROS (NR OS E COD CATEGORIA) PARA PESQUISAR ORDENS DE SERVICO
    
    public List<OrdemServico> getpesquisaOS (Integer nrOrdemServico, String categoria) {
        FacesContext facec = FacesContext.getCurrentInstance();
        setOrdemServicoLista(ordemServicoLista);
        try
        {
            ordemServicoLista = new OrdemServicoDao().pesquisaOS();
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
            facec.addMessage(null, new FacesMessage("Erro :" + ex.getMessage()));
        }
        return ordemServicoLista;
    }
    
    
    // LISTA TODOS OS NUMEROS E DATAS DE ORDENS DE SERVIÇO (TABELA CONTROLE DE O.S.)
    
    public List<ControleOS> getlistaNrsOS() {
        FacesContext fc = FacesContext.getCurrentInstance();
        try {
            controleOSLista = new OrdemServicoDao().listaNrsOS();
        } catch (Exception ex) {
            ex.printStackTrace();
            fc.addMessage(null, new FacesMessage("Erro :" + ex.getMessage()));
        }
        return controleOSLista;
    }

}

下面,页面:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">

<!--    O metodo abaixo so é validado se o bean que o executa corresponder ao criterio do login -->

<h:head>
    <f:metadata>
        <f:event listener="#{mb.verificarLogin}" type="preRenderView">
        </f:event>
    </f:metadata>
</h:head>

<h:body>

    <p:panel header="CarroTop - Pesquisa Ordens de Serviço"
        style="font-size: 15px">
        <h:form id="form1">
        </h:form>
        <h:form id="form3">
            <p:commandButton value="Sair" action="#{mb.logout}" ajax="false"></p:commandButton>
        </h:form>
    </p:panel>
    
    <p:panel header="Pesquisar Ordens de Serviço - Informe 2 Criterios">
        <h:form id="form3">
            <p:panelGrid columns="2">
                <h:outputText value="Nº Ordem Serviço"/>
                <p:inputText value="#{osb.pesquisaOS.nrAmostra}">
                </p:inputText>
                <h:outputText value="Nº Grupo (1, 3, 7 ou 9) "/>
                <p:inputText value="#{osb.pesquisaOS.grupo}">
                </p:inputText>
                <p:commandButton value="Pesquisar" update=":form1;" ajax="true" action="#{osb.pesquisaOS}">
                </p:commandButton>      
                    <p:growl>
                    </p:growl>
            </p:panelGrid>
        </h:form>
    </p:panel>

    <p:panel header="Resultado da pesquisa" style="font-size: 15px">
        <h:form id="form2">
            <p:dataTable var="pesquisaOS" value="#{osb.pesquisaOS}"
                style="font-size: 13px">
                <p:column headerText="Id">
                    <h:outputText value="#{pesquisaOS.id}" />
                </p:column>
                <p:column headerText="Nº O.S.">
                    <h:outputText value="#{pesquisaOS.nrOrdemServico}" />
                </p:column>
                <p:column headerText="Categoria">
                    <h:outputText value="#{pesquisaOS.categoria}" />
                </p:column>
                <p:column headerText="Serviço">
                    <h:outputText value="#{pesquisaOS.servico}" />
                </p:column>
                <p:column headerText="Nº Renavam">
                    <h:outputText value="#{pesquisaOS.nrRenavam}" />
                </p:column>
                <p:column headerText="Nº Orçamento">
                    <h:outputText value="#{pesquisaOS.nrOrcamento}" />
                </p:column>
                <p:column headerText="Nº Chave DANFE (NFE)">
                    <h:outputText value="#{pesquisaOS.nrChaveDanfe}" />
                </p:column>
                <p:column headerText="Data Início Serviço">
                    <h:outputText value="#{pesquisaOS.dataInicioServico}">
                        <f:convertDateTime type="date" dateStyle="short"
                            pattern="dd/MM/yyyy">
                        </f:convertDateTime>
                    </h:outputText>
                </p:column>
                
                <p:column headerText="Data Final Serviço">
                    <h:outputText value="#{pesquisaOS.dataFinalServico}">
                        <f:convertDateTime type="date" dateStyle="short"
                        pattern="dd/MM/yyyy">
                        </f:convertDateTime>
                    </h:outputText>
                </p:column>
                
                <p:column headerText="Código Ocorrência">
                    <h:outputText value="#{pesquisaOS.codOcorrencia}" />
                </p:column>
                <p:column headerText="Mecânico Executor">
                    <h:outputText value="#{pesquisaOS.usuarioExecutor}" />
                </p:column>
                <p:column headerText="Serviço Autorizado por">
                    <h:outputText value="#{pesquisaOS.usuarioAutorizador}" />
                </p:column>
                
                <p:column headerText="Valor Orçado R$">
                    <h:outputText value="#{pesquisaOS.valorPrevisto}">
                        <f:convertNumber pattern="#.##0,00" type="currency" locale="pt_BR" >
                        </f:convertNumber>      
                    
                    </h:outputText>
                </p:column>
                
                <p:column headerText="Valor Real R$">
                    <h:outputText value="#{pesquisaOS.valorEfetivo}" />
                </p:column>

            </p:dataTable>
        </h:form>
    </p:panel>

</h:body>
</html>

最后,错误堆栈:

GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/carrotop] threw exception [/ct3/logado.xhtml @32,54 value="#{osb.pesquisaOS.nrAmostra}": Property 'pesquisaOS' not found on type br.com.agoraeuquero.carrotop.controle.ServicoBean] with root cause
javax.el.PropertyNotFoundException: Property 'pesquisaOS' not found on type br.com.agoraeuquero.carrotop.controle.ServicoBean
    at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:268)
    at javax.el.BeanELResolver$BeanProperties.access0(BeanELResolver.java:221)
    at javax.el.BeanELResolver.property(BeanELResolver.java:355)
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:95)
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
    at javax.faces.component.UIOutput.getValue(UIOutput.java:174)
    at javax.faces.component.UIInput.getValue(UIInput.java:291)
    at org.primefaces.util.ComponentUtils.getValueToRender(ComponentUtils.java:75)
    at org.primefaces.component.inputtext.InputTextRenderer.encodeMarkup(InputTextRenderer.java:71)
    at org.primefaces.component.inputtext.InputTextRenderer.encodeEnd(InputTextRenderer.java:52)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1903)
    at org.primefaces.component.panelgrid.PanelGridRenderer.encodeDynamicBody(PanelGridRenderer.java:89)
    at org.primefaces.component.panelgrid.PanelGridRenderer.encodeBody(PanelGridRenderer.java:60)
    at org.primefaces.component.panelgrid.PanelGridRenderer.encodeEnd(PanelGridRenderer.java:49)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1903)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)
    at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:81)
    at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:68)
    at org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:204)
    at org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:121)
    at org.primefaces.component.panel.PanelRenderer.encodeEnd(PanelRenderer.java:58)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1903)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1899)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1899)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:451)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)



提前致谢!

ServicoBean class 有方法 getpesquisaOS() 和 getlistaNrsOS()。

应该是: getPesquisaOS() getListaNrsOS().