Olá pessoal,
eu estou precisando usar o método getAnalise da classe mãe:
//JSF - Managed Bean
public class AnaliseController {
protected Analise analise;
public Analise getAnalise() {
return analise;
}
public void setAnalise(Analise analise) {
this.analise = analise;
}
...
}
classe filha:
//JSF - Managed Bean
public class ExtratoSecoController extends AnaliseController{
public String calculaExtratoSeco(){
//Precido chamar o getAnalise aqui dentro.
}
}
Será que alguém poderia me dar uma ajuda?
[]'s.
public class ExtratoSecoController extends AnaliseController{
public String calculaExtratoSeco(){
getAnalise();
}
}
Jóia Henrique?
eu testei aqui o que você me falou apareceu a seguinte mensagem:
java.lang.NullPointerException
at controller.ExtratoSecoController.calculaExtratoSeco(ExtratoSecoController.java:79)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.el.parser.AstValue.invoke(AstValue.java:172)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
at javax.faces.component.UICommand.broadcast(UICommand.java:383)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:447)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
//Managed Bean - JSF
public class ExtratoSecoController extends AnaliseController{
public String calculaExtratoSeco(){
try{
this.extSec.setIdAnalise(super.getAnalise().getIdAnalise());
this.extSec.setAmostra(super.getAmostra());
...
this.extSec.calculaExtratoSeco();
}
...
}
}
public class AnaliseController {
private Amostra amostra = new Amostra();
//A classe Análise é abstrata.
protected Analise analise;
//get's e set's
...
}
//No JSF:
<h:commandButton action="#{ExtratoSecoController.calculaExtratoSeco}" value="Calcular">
<f:setPropertyActionListener target="#{ExtratoSecoController.idAnalise}" value="#{Analise Controller.analise.idAnalise}" />
<f:setPropertyActionListener target="#{ExtratoSecoController.amostra}" value="#{Analise Controller.amostra}" />
</h:commandButton>
O que eu estou fazendo de errado Henrique?
Será que vc ou alguém pode me dar uma ajuda?
[]'s.
No caso do JSF, você tem que instanciar o objeto. No seu caso seria algo assim
protected Analise analise = new Analise();
Jóia Jair?
então só tem um probleminha a classe Análise é abstrata.
e agora o que eu faço?
Será que tem como vc Jair ou alguém me dar uma ajuda?
[]'s.
Se ela é uma classe abstrata, então você tem que instanciar ela através de uma classe concreta que implemente a classe abstrata.
Dê uma forma ou outra você vai precisar de uma classe concreta, seja para instanciar ou no futuro você for usar injeção de dependência.
Jóia Jair?
Eu estou usando herança?
por isso e tenho 12 classes filha de análise
no meu exemplo estou usando Extrato Seco que é
uma análise.
Eu não posso fazer isso pois eu não sei
qual análise vai ser pode ser qualquer uma das 12 análises
protected Analise analise = new ExtratoSeco();
Será que tem como vc Jair ou alguém me dar uma ajuda?
[]'s.
Quem vai diferenciar é o tipo da Análise que eu não coloquei no exemplos.
[]'s.
A primeira vista no seu caso eu daria 3 sugestões:
1 - Criar uma Factory para retornar a instancia correta da Analise. Por exemplo, alguma flag que vem da VIEW, informaria o tipo de Analise e assim a sua Factory retornaria a instancia correta. Estude esse padrão que creio que vá ficar mais claro (AbstractFactory, FactoryMethod ou então o SimpleFactory pode te ajudar)
2 - Faça a injeção de dependência da instancia correta. Isso pode ser um pouco mais complicado, caso você não use um framework que faça essa injeção (exemplo Spring).
3 - A mais fácil, que eu acredito, é definir quais os ManagedBeans e métodos de cada instancia. Assim quando um determinado managedBean/método for executado, ele criaria a instancia da Analise
Faça os testes ai e veja se consegue algo que resolva o seu problema
Será que você não poderia aproveitar o polimorfismo nesse caso?
Lembre-se de que quando uma classe concreta estende uma classe abstrata, esta deverá implementar todos os métodos abstratos da superclasse, certo ?
Então qual implementação dos métodos será utilizada, vai depender do quê você está atribuindo na instância Analise, por exemplo:
Analise obj1 = new ExtratoSeco();
Analise obj2 = new QualquerOutraQueImplemente();
obj1 poderá acessar as implementações de ExtratoSeco e somente dele.
Não sei se me fiz entender…
Abraço…