You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by Mark Struberg <st...@yahoo.de> on 2019/06/02 14:02:51 UTC

f:viewParam NPE due to bean validation?

Hi folks!

I'm pretty rusty in JSF, but came back to it for a smallish application.
I'm using MyFaces-2.3.3 via TomEE-8.0-M3.

I have a pate ballotDetail.xhtml which should be bookmarkable. Invocation is
http://localhost:8080/voting/ballotDetail.xhtml?dswid=-3043&ballotId=10000

dswid is from DeltaSpike and should be perfectly transparent.

For the ballotId I have the following viewParam section:

<f:metadata>
    <f:viewParam name="ballotId" value="#{ballotDetail.ballotId}"/>
    <f:viewAction action="#{ballotDetail.loadBallot}"/>
</f:metadata>

In the ballotDetail backing bean I have an Integer ballotId which initially is null.
Funnily the param will not be set, but first MyFaces now invokes a getBallotId() and bombs up with a NPE during validation in phase PROCESS_VALIDATIONS.
Stacktrace is as follows:

org.apache.myfaces.view.facelets.el.ContextAwareELException: javax.el.ELException: Error reading [ballotId] on type ....fe.BallotDetailModel$$OwbNormalScopeProxy0]
	at org.apache.myfaces.view.facelets.el.ContextAwareTagValueExpression.getValue(ContextAwareTagValueExpression.java:101)
	at javax.faces.component._DeltaStateHelper.eval(_DeltaStateHelper.java:356)
	at javax.faces.component.UIOutput.getValue(UIOutput.java:67)
	at javax.faces.component.UIInput.getValue(UIInput.java:170)
	at javax.faces.component.UIInput.validate(UIInput.java:759)
	at javax.faces.component.UIInput.processValidators(UIInput.java:293)
	at javax.faces.component.UIViewParameter.processValidators(UIViewParameter.java:215)
	at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1458)
	at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1451)
	at javax.faces.component.UIViewRoot._processValidatorsDefault(UIViewRoot.java:1782)
	at javax.faces.component.UIViewRoot.access$600(UIViewRoot.java:81)
	at javax.faces.component.UIViewRoot$ProcessValidatorPhaseProcessor.process(UIViewRoot.java:1889)
	at javax.faces.component.UIViewRoot._process(UIViewRoot.java:1738)
	at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:982)
	at org.apache.myfaces.lifecycle.ProcessValidationsExecutor.execute(ProcessValidationsExecutor.java:38)
	at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:195)
	at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:142)
	at org.apache.deltaspike.jsf.impl.listener.request.DeltaSpikeLifecycleWrapper.execute(DeltaSpikeLifecycleWrapper.java:89)
	at javax.faces.lifecycle.LifecycleWrapper.execute(LifecycleWrapper.java:57)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:204)


I also tried to set required="false", but didn't help neither. Same Stacktrace

If I initiate the ballotId with -1 then the setBallotId is properly being set in phase UPDATE_MODEL_VALUES.

I don't remember such problems. Is this a new behaviour? Is it correct?
Feels counter intuitive at least.

txs and LieGrue,
strub

Re: f:viewParam NPE due to bean validation?

Posted by Mark Struberg <st...@yahoo.de>.
Hi Tomas!

Yes, I tried it with older MyFaces versions and they fail as well.
And then I figured why: my bean variable was an Integer, but the getter returned int ^^ ;)

So MyFaces is perfectly fine, and I'm the one to blame ;)

All fine, all saved!

txs and LieGrue,
strub


> Am 02.06.2019 um 16:19 schrieb Thomas Andraschko <an...@gmail.com>:
> 
> No idea curently but i would assume that 
> 1) viewParam must be assigned first before execute validation
> 2) it should not throw an npe, also If your int is null
> 
> Please dig a bit deeper and also try 2.3.1 e.g.
> We also released 2.3.4, which fixes a bug related to deltaspike
> 
> Mark Struberg <st...@yahoo.de> schrieb am So., 2. Juni 2019, 15:03:
> Hi folks!
> 
> I'm pretty rusty in JSF, but came back to it for a smallish application.
> I'm using MyFaces-2.3.3 via TomEE-8.0-M3.
> 
> I have a pate ballotDetail.xhtml which should be bookmarkable. Invocation is
> http://localhost:8080/voting/ballotDetail.xhtml?dswid=-3043&ballotId=10000
> 
> dswid is from DeltaSpike and should be perfectly transparent.
> 
> For the ballotId I have the following viewParam section:
> 
> <f:metadata>
>     <f:viewParam name="ballotId" value="#{ballotDetail.ballotId}"/>
>     <f:viewAction action="#{ballotDetail.loadBallot}"/>
> </f:metadata>
> 
> In the ballotDetail backing bean I have an Integer ballotId which initially is null.
> Funnily the param will not be set, but first MyFaces now invokes a getBallotId() and bombs up with a NPE during validation in phase PROCESS_VALIDATIONS.
> Stacktrace is as follows:
> 
> org.apache.myfaces.view.facelets.el.ContextAwareELException: javax.el.ELException: Error reading [ballotId] on type ....fe.BallotDetailModel$$OwbNormalScopeProxy0]
>         at org.apache.myfaces.view.facelets.el.ContextAwareTagValueExpression.getValue(ContextAwareTagValueExpression.java:101)
>         at javax.faces.component._DeltaStateHelper.eval(_DeltaStateHelper.java:356)
>         at javax.faces.component.UIOutput.getValue(UIOutput.java:67)
>         at javax.faces.component.UIInput.getValue(UIInput.java:170)
>         at javax.faces.component.UIInput.validate(UIInput.java:759)
>         at javax.faces.component.UIInput.processValidators(UIInput.java:293)
>         at javax.faces.component.UIViewParameter.processValidators(UIViewParameter.java:215)
>         at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1458)
>         at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1451)
>         at javax.faces.component.UIViewRoot._processValidatorsDefault(UIViewRoot.java:1782)
>         at javax.faces.component.UIViewRoot.access$600(UIViewRoot.java:81)
>         at javax.faces.component.UIViewRoot$ProcessValidatorPhaseProcessor.process(UIViewRoot.java:1889)
>         at javax.faces.component.UIViewRoot._process(UIViewRoot.java:1738)
>         at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:982)
>         at org.apache.myfaces.lifecycle.ProcessValidationsExecutor.execute(ProcessValidationsExecutor.java:38)
>         at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:195)
>         at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:142)
>         at org.apache.deltaspike.jsf.impl.listener.request.DeltaSpikeLifecycleWrapper.execute(DeltaSpikeLifecycleWrapper.java:89)
>         at javax.faces.lifecycle.LifecycleWrapper.execute(LifecycleWrapper.java:57)
>         at javax.faces.webapp.FacesServlet.service(FacesServlet.java:204)
> 
> 
> I also tried to set required="false", but didn't help neither. Same Stacktrace
> 
> If I initiate the ballotId with -1 then the setBallotId is properly being set in phase UPDATE_MODEL_VALUES.
> 
> I don't remember such problems. Is this a new behaviour? Is it correct?
> Feels counter intuitive at least.
> 
> txs and LieGrue,
> strub


Re: f:viewParam NPE due to bean validation?

Posted by Thomas Andraschko <an...@gmail.com>.
No idea curently but i would assume that
1) viewParam must be assigned first before execute validation
2) it should not throw an npe, also If your int is null

Please dig a bit deeper and also try 2.3.1 e.g.
We also released 2.3.4, which fixes a bug related to deltaspike

Mark Struberg <st...@yahoo.de> schrieb am So., 2. Juni 2019, 15:03:

> Hi folks!
>
> I'm pretty rusty in JSF, but came back to it for a smallish application.
> I'm using MyFaces-2.3.3 via TomEE-8.0-M3.
>
> I have a pate ballotDetail.xhtml which should be bookmarkable. Invocation
> is
> http://localhost:8080/voting/ballotDetail.xhtml?dswid=-3043&ballotId=10000
>
> dswid is from DeltaSpike and should be perfectly transparent.
>
> For the ballotId I have the following viewParam section:
>
> <f:metadata>
>     <f:viewParam name="ballotId" value="#{ballotDetail.ballotId}"/>
>     <f:viewAction action="#{ballotDetail.loadBallot}"/>
> </f:metadata>
>
> In the ballotDetail backing bean I have an Integer ballotId which
> initially is null.
> Funnily the param will not be set, but first MyFaces now invokes a
> getBallotId() and bombs up with a NPE during validation in phase
> PROCESS_VALIDATIONS.
> Stacktrace is as follows:
>
> org.apache.myfaces.view.facelets.el.ContextAwareELException:
> javax.el.ELException: Error reading [ballotId] on type
> ....fe.BallotDetailModel$$OwbNormalScopeProxy0]
>         at
> org.apache.myfaces.view.facelets.el.ContextAwareTagValueExpression.getValue(ContextAwareTagValueExpression.java:101)
>         at
> javax.faces.component._DeltaStateHelper.eval(_DeltaStateHelper.java:356)
>         at javax.faces.component.UIOutput.getValue(UIOutput.java:67)
>         at javax.faces.component.UIInput.getValue(UIInput.java:170)
>         at javax.faces.component.UIInput.validate(UIInput.java:759)
>         at
> javax.faces.component.UIInput.processValidators(UIInput.java:293)
>         at
> javax.faces.component.UIViewParameter.processValidators(UIViewParameter.java:215)
>         at
> javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1458)
>         at
> javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1451)
>         at
> javax.faces.component.UIViewRoot._processValidatorsDefault(UIViewRoot.java:1782)
>         at javax.faces.component.UIViewRoot.access$600(UIViewRoot.java:81)
>         at
> javax.faces.component.UIViewRoot$ProcessValidatorPhaseProcessor.process(UIViewRoot.java:1889)
>         at javax.faces.component.UIViewRoot._process(UIViewRoot.java:1738)
>         at
> javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:982)
>         at
> org.apache.myfaces.lifecycle.ProcessValidationsExecutor.execute(ProcessValidationsExecutor.java:38)
>         at
> org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:195)
>         at
> org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:142)
>         at
> org.apache.deltaspike.jsf.impl.listener.request.DeltaSpikeLifecycleWrapper.execute(DeltaSpikeLifecycleWrapper.java:89)
>         at
> javax.faces.lifecycle.LifecycleWrapper.execute(LifecycleWrapper.java:57)
>         at javax.faces.webapp.FacesServlet.service(FacesServlet.java:204)
>
>
> I also tried to set required="false", but didn't help neither. Same
> Stacktrace
>
> If I initiate the ballotId with -1 then the setBallotId is properly being
> set in phase UPDATE_MODEL_VALUES.
>
> I don't remember such problems. Is this a new behaviour? Is it correct?
> Feels counter intuitive at least.
>
> txs and LieGrue,
> strub