Problemas com Action + ActionForm + JPA

6 respostas
mcoelhao

Boa noite pessoal,
Estou batendo cabeça a vários dias com o mesmo problema e não consigo sair do lugar.
Estou tentando popular um combo no JSP usando a estrutura de Action + ActoinForm + JPA, seguem meus códigos.
JSP

<p>Fornecedor:<br>
                  <!-- propriedade que armazena o que o usuário escrever. -->
                  <html:select property="idFornecedor">
                    <option name="" value=""> --- </option>
                    <!-- popula os valores da combo com a lista de fornecedores. -->
                    <html:optionsCollection property="fornecedores" value="empresacodigo" label="nomeFantasia" />
                  </html:select>

Action

public class AdicionaCompraAction extends Action {
    
    /* forward name="success" path="" */
    private final static String SUCCESS = "success";
    
    /**
     * This is the action called from the Struts framework.
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @throws java.lang.Exception
     * @return
     */
   
    @Override
    @SuppressWarnings("unchecked")
    public ActionForward execute(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        //log
        System.out.println("Tentanto criar um novo pedido...");
        @SuppressWarnings("unchecked")
        List listfornecedor = new FornecedorDAO().listFornecedor();
        PedidoCompraForm formularioCompra = (PedidoCompraForm) form;
        
        request.setAttribute("fornecedores", listfornecedor);
               
        Pedidocompra compras = formularioCompra.getPedidoCompra();
      
        PedidoCompraDAO dao = new PedidoCompraDAO();
        dao.salvar(compras);
        
        return mapping.findForward("ok");
        
    }

ActionForm

public class PedidoCompraForm extends ActionForm {
    private static final long serialVersionUID = 6277201993742385240L;
        
    private Pedidocompra pedidoCompra = new Pedidocompra();
    private String idFuncionario = "";
    private List funcionariosolicitante;
    private String idFornecedor = "";
    private List fornecedores;
    private String idProjeto = "";
    private List projetos;

//get e set

Erro 01

org.apache.jasper.JasperException: An exception occurred processing JSP page /novaCompra.jsp at line 45

42:                   <html:select property="idFornecedor">
43:                     <option name="" value=""> --- </option>
44:                     <!-- popula os valores da combo com a lista de fornecedores. -->
45:                     <html:optionsCollection property="fornecedor" value="empresacodigo" label="nomeFantasia" />
46:                   </html:select>
47:             </p>
48:             <p>Solicitante:</p>

root cause

javax.servlet.ServletException: javax.servlet.jsp.JspException: Failed to obtain specified collection
	org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:852)
	org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)
	org.apache.jsp.novaCompra_jsp._jspService(novaCompra_jsp.java:100)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

Erro02

org.apache.jasper.JasperException: An exception occurred processing JSP page /novaCompra.jsp at line 45

42:                   <html:select property="idFornecedor">
43:                     <option name="" value=""> --- </option>
44:                     <!-- popula os valores da combo com a lista de fornecedores. -->
45:                     <html:optionsCollection property="fornecedores" value="empresacodigo" label="nomeFantasia" />
46:                   </html:select>
47:             </p>
48:             <p>Solicitante:</p>

root cause

javax.servlet.ServletException: javax.servlet.jsp.JspException: No getter method for property: "fornecedores" of bean: "br.com.erpciriello.compras.struts.form.PedidoCompraForm"
	org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:852)
	org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)
	org.apache.jsp.novaCompra_jsp._jspService(novaCompra_jsp.java:100)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

Qualquer luz já ajuda.

valeu…

6 Respostas

danieldestro

Na Action, tente:

Esquece aquele request.setAttribute(“fornecedores”, listfornecedor);

mcoelhao

Oi Daniel,

Obrigado pela ajuda.
Agora e o outro erro?? Ele diz que não tem os gets e sets no ActionForm, mas no entanto eles estão lá… Será que tem alguma coisa a mais para fazer?
Sinceramente, creio que não… pois eu construi essa classe e não fiz nada de mais para os atributos e funcionaram…

Qualquer outra luz eu agradeço…

danieldestro

O certo é “empresacodigo” ou “empresaCodigo” ???

mcoelhao

Oi Daniel,

É “empresacodigo”, conforme a geração das entidades feitas pelo netbeans.
Agora, eu fiz uma classe de teste de conexão no meu banco, MySQL, com o seguinte código:

<c:catch var="error">
    <jsp:useBean id="dao" class="br.com.erpciriello.compras.dao.FornecedorDAO" />
    <c:forEach var="fornecedor" items="${dao.listFornecedor}">
        <li>
            Código: ${fornecedor.empresacodigo}
            Nome: ${fornecedor.nomeFantasia}
        </li>
    </c:forEach>
    </c:catch>
    <c:if test="${not empty error}">
        Ocorreu algum erro ao acessar o banco de dados.
    </c:if>

E ele me retornou o erro de conexão no banco. Realmente não sei o que pode estar errado.
Segue meu persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="PUCiriello" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>JNDICiriello</jta-data-source>
    <properties/>
  </persistence-unit>
</persistence>

Agradeço a ajuda Daniel.

danieldestro

Ops, agora vi melhor a segunda msg de erro.
Certeza que seu form bean tem um “getFornecedores()” ???

E pelo o que você colocou no JSP, seu bean de “fornecedor” tem que ter “getEmpresacodigo()” e “getNomeFantasia()”.

Exatamente do jeito que escrevi (maiúsculas e minúsculas).

mcoelhao

Oi Daniel,

Tem exatamente conforme você escreveu. segue ele aí:

@Entity
@Table(name = "fornecedor")
@NamedQueries({@NamedQuery(name = "Fornecedor.findByEmpresacodigo", query = "SELECT f FROM Fornecedor f WHERE f.empresacodigo = :empresacodigo"), @NamedQuery(name = "Fornecedor.findByNomeFantasia", query = "SELECT f FROM Fornecedor f WHERE f.nomeFantasia = :nomeFantasia")})
public class Fornecedor implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "Empresa_codigo", nullable = false)
    private Integer empresacodigo;
    @Column(name = "nomeFantasia")
    private String nomeFantasia;
    @JoinTable(name = "fornecedor_has_produto", joinColumns = {@JoinColumn(name = "Fornecedor_Empresa_codigo", referencedColumnName = "Empresa_codigo")}, inverseJoinColumns = {@JoinColumn(name = "Produto_codigo", referencedColumnName = "codigo")})
    @ManyToMany
    private Collection<Produto> produtocodigoCollection;
    @JoinColumn(name = "Empresa_codigo", referencedColumnName = "codigo", insertable = false, updatable = false)
    @OneToOne
    private Empresa empresa;

    public Fornecedor() {
    }

    public Fornecedor(Integer empresacodigo) {
        this.empresacodigo = empresacodigo;
    }

    public Integer getEmpresacodigo() {
        return empresacodigo;
    }

    public void setEmpresacodigo(Integer empresacodigo) {
        this.empresacodigo = empresacodigo;
    }

    public String getNomeFantasia() {
        return nomeFantasia;
    }

    public void setNomeFantasia(String nomeFantasia) {
        this.nomeFantasia = nomeFantasia;
    }

    public Collection<Produto> getProdutocodigoCollection() {
        return produtocodigoCollection;
    }

    public void setProdutocodigoCollection(Collection<Produto> produtocodigoCollection) {
        this.produtocodigoCollection = produtocodigoCollection;
    }

    public Empresa getEmpresa() {
        return empresa;
    }

    public void setEmpresa(Empresa empresa) {
        this.empresa = empresa;
    }

Se você quiser posso mandar o projeto para o seu e-mail, pois como falei anteriormente não consigo ver onde está o erro. Segui as formas de utilizar o JPA em alguns tutoriais e apliquei no meu projeto.

Novamente, valeu…

Criado 13 de outubro de 2008
Ultima resposta 14 de out. de 2008
Respostas 6
Participantes 2