Struts 2 - Camada Service null

6 respostas
L

Pessoal;

Tenho minha action logo abaixo :

package action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;

import services.clienteService;
import domain.clienteDomain;


@Namespace(value = "/jsp/paginas")
public class cadastroAction {
	
	/*
	 * Variáveis.
	 */
	private String SUCCESS = "success";
	
	public clienteService service;
	
	public clienteDomain cliente;

	/*
	 * Salva os dados do formulário no banco.
	 */
	@Action(value = "cliente", results = @Result(name = "success", location = "/jsp/paginas/cadastroCliente.jsp"))
 	public String salvar() {
		service.salvar(cliente);
		return SUCCESS;
	}

	/*	 * Métodos getters e setters.
	 */
	/**
	 * @param cliente the cliente to set
	 */
	public final void setCliente(clienteDomain cliente) {
		this.cliente = cliente;
	}

	/**
	 * @param service the service to set
	 */
	public final void setService(clienteService service) {
		this.service = service;
	}
	
}

O que ocorre é o seguinte, minha variável service está como null sempre que dou um submit no formulário jsp.
Lembrando que a variável cliente está com todos os atributos preenchidos conforme informado no formulário jsp.

Estou trabalhando com camadas, este service é uma interface e possuo uma classe que implementa ela.

Algiuém tem alguma idéia do que pode estar ocorrendo ?

Obrigado.

6 Respostas

edysnipes

Boa noite lucas.

Retire:

[code]
/**
* @param service the service to set
*/
public final void setService(clienteService service) {
this.service = service;
}
[code]

e verifique se o nullpointer está no service ou no salvar.

Até mais.

edysnipes
edysnipes:
Boa noite lucas.

Retire:

[code]
/**
* @param service the service to set
*/
public final void setService(clienteService service) {
this.service = service;
}
[code]

e verifique se o nullpointer está no service ou no salvar.

Até mais.

PS: Implemente o ActionSuport em suas Action. Existem vários benefícios como por exemplo tipos de retorno SUCESS, ERROR, INPUT, etc.

drsmachado
edysnipes:
edysnipes:
Boa noite lucas.

Retire:

[code]
/**
* @param service the service to set
*/
public final void setService(clienteService service) {
this.service = service;
}
[code]

e verifique se o nullpointer está no service ou no salvar.

Até mais.

PS: Implemente o ActionSuport em suas Action. Existem vários benefícios como por exemplo tipos de retorno SUCESS, ERROR, INPUT, etc.

A vantagem do strtus 2 é justamente não precisar desse implements...

Quanto ao teu problema, lucas_duzo, fiquei curioso por utilizar o final nos setters.
Até onde sei, a especificação javaBeans (que é incorporada pelo Struts 2), não necessita desse modificador.

edysnipes

Boa tarde.

Valeu pela dica machado.

Mas gostaria que você explicasse os prós e contras do uso do ActionSuport.

Como você seta as mensagens do antigo addActionError() por exemplo?

Abrigado.

L
drsmachado:
edysnipes:
edysnipes:
Boa noite lucas.

Retire:

[code]
/**
* @param service the service to set
*/
public final void setService(clienteService service) {
this.service = service;
}
[code]

e verifique se o nullpointer está no service ou no salvar.

Até mais.

PS: Implemente o ActionSuport em suas Action. Existem vários benefícios como por exemplo tipos de retorno SUCESS, ERROR, INPUT, etc.

A vantagem do strtus 2 é justamente não precisar desse implements...

Quanto ao teu problema, lucas_duzo, fiquei curioso por utilizar o final nos setters.
Até onde sei, a especificação javaBeans (que é incorporada pelo Struts 2), não necessita desse modificador.

Bom dia Machado;

Retirei o "final" dos setters, porém continuo com o mesmo problema, meu domain está perfeito, porém o service não !!!
=/

Segui o link http://vonjuliano.wordpress.com/2010/12/07/trabalhando-com-struts-2-de-forma-simples/ para entender um pouco mais struts2....

Obrigado

drsmachado
public clienteService service;   
       
    public clienteDomain cliente;   
  
    /*  
     * Salva os dados do formulário no banco.  
     */   
    @Action(value = "cliente", results = @Result(name = "success", location = "/jsp/paginas/cadastroCliente.jsp"))   
    public String salvar() {   
        service.salvar(cliente);   
        return SUCCESS;   
    }

Pois bem…
O trecho acima é do teu código. Em momento algum você instancia teu service e, a não ser que esteja trabalhando com Spring Framework para fazer a injeção do mesmo, você precisaria fazer um

service = new ClienteService();

Veja que aqui, neste exemplo, ele tem o dao e, no construtor da Action, ele instancia o mesmo:

public CarroAction() {  

        this.dao = new JdbcCarroDao();  

    }

Sem que você instancie, ele nunca terá valor, será sempre null.

Ao que me parece, você apenas modificou a estrutura, adicionou um service, baseado na última parte do exemplo.

Criado 8 de dezembro de 2011
Ultima resposta 12 de dez. de 2011
Respostas 6
Participantes 3