[ https://issues.apache.org/jira/browse/MYFACES-1741?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12537907 ]
Martin Marinschek commented on MYFACES-1741: -------------------------------------------- As soon as you have a patch ready (with documentation), I'll take a look at it. I haven't looked to deep into the spec with regards to this binding attribute on converters/validators so far. regards, Martin > JSR-252 Issue 21 - Provided an additional "binding" attribute for the core > Converter, Listener and Validator tags has wrong behaviour > ------------------------------------------------------------------------------------------------------------------------------------- > > Key: MYFACES-1741 > URL: https://issues.apache.org/jira/browse/MYFACES-1741 > Project: MyFaces Core > Issue Type: Bug > Components: JSR-252 > Affects Versions: 1.2.0 > Environment: Tomcat 6.0.14, Myfaces 1.2.1-SNAPSHOT (Oct 7 2007) > Reporter: Leonardo Uribe > Fix For: 1.2.1-SNAPSHOT > > > There is a problem with the behaviour of binding attribute from > actionListeners, validators and converters. > I have this test. The objective is explore how binding attribute is doing > things comparing jsf ri 1.2 and > myfaces 1.2.1-SNAPSHOT, trying to detect bugs on myfaces :) > bindingCLV.jsp > <%@ page session="false" contentType="text/html;charset=utf-8"%> > <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> > <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> > <html> > <f:view beforePhase="#{bindingCLVBean.beforePhase}" > afterPhase="#{bindingCLVBean.afterPhase}"> > <[EMAIL PROTECTED] file="inc/head.inc"%> > <body> > <f:loadBundle > basename="org.apache.myfaces.examples.resource.example_messages" > var="example_messages" /> > <h1>Myfaces Examples JSF 1.2 Additions</h1> > <h:messages></h:messages> > <h:form id="form"> > <h:panelGrid id="grid" columns="3"> > <h:outputLabel value="BigInt" > for="bigint"></h:outputLabel> > <h:inputText id="bigint" > binding="#{bindingCLVBean.input1}" value="#{bindingCLVBean.bigint}"> > <f:converter > converterId="javax.faces.BigInteger" > binding="#{bindingCLVBean.converterBigint}"/> > <f:validator > validatorId="org.apache.myfaces.bindingCLV.DummyValidator" > > binding="#{bindingCLVBean.validatorBigint}"/> > </h:inputText> > <h:message for="bigint"></h:message> > <h:outputLabel value="BigDecimal" > for="bigdecimal"></h:outputLabel> > <h:inputText id="bigdecimal" > binding="#{bindingCLVBean.input2}" value="#{bindingCLVBean.bigdecimal}"> > <f:converter > converterId="javax.faces.BigDecimal" > binding="#{bindingCLVBean.converterBigdecimal}"/> > <f:validator > validatorId="org.apache.myfaces.bindingCLV.DummyValidator" > binding="#{bindingCLVBean.validatorBigdecimal}"/> > </h:inputText> > <h:message for="bigdecimal"></h:message> > </h:panelGrid> > <h:commandButton id="button1" value="press me" > action="#{bindingCLVBean.update}" > > <f:actionListener > type="org.apache.myfaces.bindingCLV.DummyActionListener" > binding="#{bindingCLVBean.listener}" /> > </h:commandButton> > </h:form> > </body> > </f:view> > </html> > Bean: > package org.apache.myfaces.bindingCLV; > import java.math.BigDecimal; > import java.math.BigInteger; > import javax.faces.application.FacesMessage; > import javax.faces.component.html.HtmlInputText; > import javax.faces.context.FacesContext; > import javax.faces.convert.Converter; > import javax.faces.event.ActionListener; > import javax.faces.event.PhaseEvent; > import javax.faces.validator.Validator; > import org.apache.commons.logging.Log; > import org.apache.commons.logging.LogFactory; > public class BindingCLVBean { > private BigInteger bigint; > > private BigDecimal bigdecimal; > > private Converter converterBigint; > > private Converter converterBigdecimal; > > private Validator validatorBigint; > > private Validator validatorBigdecimal; > > private HtmlInputText input1; > > private HtmlInputText input2; > > private ActionListener listener; > > Log log = LogFactory.getLog(BindingCLVBean.class); > > public void beforePhase(PhaseEvent phaseEvent){ > FacesContext facesContext = FacesContext.getCurrentInstance(); > > > facesContext.addMessage(null, new FacesMessage("This is the > message for phase before "+phaseEvent.getPhaseId().toString())); > facesContext.addMessage(null, new > FacesMessage("Component:"+this.getInput1())); > facesContext.addMessage(null, new > FacesMessage("Validator:"+this.getValidatorBigdecimal())); > facesContext.addMessage(null, new > FacesMessage("Converter:"+this.getConverterBigdecimal())); > facesContext.addMessage(null, new > FacesMessage("ActionListener:"+this.getListener())); > log.info("This is the message for phase before > "+phaseEvent.getPhaseId().toString()+" : "); > } > > public void afterPhase(PhaseEvent phaseEvent){ > FacesContext facesContext = FacesContext.getCurrentInstance(); > > > facesContext.addMessage(null, new FacesMessage("This is the > message for phase after "+phaseEvent.getPhaseId().toString())); > facesContext.addMessage(null, new > FacesMessage("Component:"+this.getInput1())); > facesContext.addMessage(null, new > FacesMessage("Validator:"+this.getValidatorBigdecimal())); > facesContext.addMessage(null, new > FacesMessage("Converter:"+this.getConverterBigdecimal())); > facesContext.addMessage(null, new > FacesMessage("ActionListener:"+this.getListener())); > log.info("This is the message for phase after > "+phaseEvent.getPhaseId().toString()+" : "); > } > > public BigInteger getBigint() { > return bigint; > } > public void setBigint(BigInteger bigint) { > this.bigint = bigint; > } > public BigDecimal getBigdecimal() { > return bigdecimal; > } > public void setBigdecimal(BigDecimal bigdecimal) { > this.bigdecimal = bigdecimal; > } > public Converter getConverterBigint() { > return converterBigint; > } > public void setConverterBigint(Converter converterBigint) { > this.converterBigint = converterBigint; > } > public Converter getConverterBigdecimal() { > return converterBigdecimal; > } > public void setConverterBigdecimal(Converter converterBigdecimal) { > this.converterBigdecimal = converterBigdecimal; > } > public Validator getValidatorBigint() { > return validatorBigint; > } > public void setValidatorBigint(Validator validatorBigint) { > this.validatorBigint = validatorBigint; > } > public Validator getValidatorBigdecimal() { > return validatorBigdecimal; > } > public void setValidatorBigdecimal(Validator validatorBigdecimal) { > this.validatorBigdecimal = validatorBigdecimal; > } > > public String update(){ > FacesContext context = FacesContext.getCurrentInstance(); > return "update"; > } > public HtmlInputText getInput1() { > return input1; > } > public void setInput1(HtmlInputText input1) { > this.input1 = input1; > } > public HtmlInputText getInput2() { > return input2; > } > public void setInput2(HtmlInputText input2) { > this.input2 = input2; > } > public ActionListener getListener() { > return listener; > } > public void setListener(ActionListener listener) { > this.listener = listener; > } > } > When you call the page the first time, this is the output for <h:messages> > tag : > JSF RI: > * This is the message for phase before RENDER_RESPONSE 6 > * Component:[EMAIL PROTECTED] > * Validator:null > * Converter:null > * ActionListener:null > Myfaces: > * This is the message for phase before RENDER_RESPONSE(6) > * Component:[EMAIL PROTECTED] > * Validator:[EMAIL PROTECTED] > * Converter:[EMAIL PROTECTED] > * ActionListener:[EMAIL PROTECTED] > QUESTION 1: Why do I create an object that I do not use?. Myfaces is wrong, > and JSF RI has the correct behaviour. > The first time that I load a page, it's unnecesary to create those objects. > And when you press the button or submit the form: > JSF RI: > * This is the message for phase before APPLY_REQUEST_VALUES 2 > * Component:[EMAIL PROTECTED] > * Validator:null > * Converter:null > * ActionListener:null > * This is the message for phase after APPLY_REQUEST_VALUES 2 > * Component:[EMAIL PROTECTED] > * Validator:null > * Converter:null > * ActionListener:null > * This is the message for phase before PROCESS_VALIDATIONS 3 > * Component:[EMAIL PROTECTED] > * Validator:null > * Converter:null > * ActionListener:null > * This is the message for phase after PROCESS_VALIDATIONS 3 > * Component:[EMAIL PROTECTED] > * Validator:[EMAIL PROTECTED] > * Converter:[EMAIL PROTECTED] > * ActionListener:null > * This is the message for phase before UPDATE_MODEL_VALUES 4 > * Component:[EMAIL PROTECTED] > * Validator:[EMAIL PROTECTED] > * Converter:[EMAIL PROTECTED] > * ActionListener:null > * This is the message for phase after UPDATE_MODEL_VALUES 4 > * Component:[EMAIL PROTECTED] > * Validator:[EMAIL PROTECTED] > * Converter:[EMAIL PROTECTED] > * ActionListener:null > * This is the message for phase before INVOKE_APPLICATION 5 > * Component:[EMAIL PROTECTED] > * Validator:[EMAIL PROTECTED] > * Converter:[EMAIL PROTECTED] > * ActionListener:null > * This is the message for phase after INVOKE_APPLICATION 5 > * Component:[EMAIL PROTECTED] > * Validator:[EMAIL PROTECTED] > * Converter:[EMAIL PROTECTED] > * ActionListener:[EMAIL PROTECTED] > * This is the message for phase before RENDER_RESPONSE 6 > * Component:[EMAIL PROTECTED] > * Validator:[EMAIL PROTECTED] > * Converter:[EMAIL PROTECTED] > * ActionListener:[EMAIL PROTECTED] > Myfaces: > * This is the message for phase before APPLY_REQUEST_VALUES(2) > * Component:[EMAIL PROTECTED] > * Validator:null > * Converter:null > * ActionListener:null > * This is the message for phase after APPLY_REQUEST_VALUES(2) > * Component:[EMAIL PROTECTED] > * Validator:null > * Converter:null > * ActionListener:null > * This is the message for phase before PROCESS_VALIDATIONS(3) > * Component:[EMAIL PROTECTED] > * Validator:null > * Converter:null > * ActionListener:null > * This is the message for phase after PROCESS_VALIDATIONS(3) > * Component:[EMAIL PROTECTED] > * Validator:null > * Converter:null > * ActionListener:null > * This is the message for phase before UPDATE_MODEL_VALUES(4) > * Component:[EMAIL PROTECTED] > * Validator:null > * Converter:null > * ActionListener:null > * This is the message for phase after UPDATE_MODEL_VALUES(4) > * Component:[EMAIL PROTECTED] > * Validator:null > * Converter:null > * ActionListener:null > * This is the message for phase before INVOKE_APPLICATION(5) > * Component:[EMAIL PROTECTED] > * Validator:null > * Converter:null > * ActionListener:null > * This is the message for phase after INVOKE_APPLICATION(5) > * Component:[EMAIL PROTECTED] > * Validator:null > * Converter:null > * ActionListener:null > * This is the message for phase before RENDER_RESPONSE(6) > * Component:[EMAIL PROTECTED] > * Validator:[EMAIL PROTECTED] > * Converter:[EMAIL PROTECTED] > * ActionListener:[EMAIL PROTECTED] > QUESTION 2: Why I not have bindings assigned before INVOKE_APPLICATION ?(in > this time is of value have a binding attribute) . > Again JSF RI has the correct behaviour and Myfaces is wrong. Myfaces create > the validators, converters and > actionListeners on correct time, but not assign bindings when is supposed to > do. If I assign a binding for > converter, validator or actionListener, I should be assigned minimum before > INVOKE_APPLICATION, or better, > converters and validators on PROCESS_VALIDATIONS, and actionListeners in > INVOKE_APPLICATION. > Looks a little bit difficult but I will try to find a solution for this issue. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.