Search code examples
jsfrichfacesjsf-1.2ajax4jsf

a4j:support in a reRender is not working


I have a button. If this is pressed, a checkbox should be rendered.
This of course works pretty well. The checkbox should, when changed call a function, which should just System.out.println() something so I see it's called.
The problem is: just the simple checkbox function, without the rerendering works pretty well. But as soon as the a4j:support is rerendered, it's not working, the System.out.println() is never called

This looks so easy, but I don't know why it's not working at all!
Any hint/trick?

This is old environment, so JSF 1.2 only.

My xhtml

        <s:div id="sdBoolCheckboxtest">
        #{testController.testRerenderBool}
            <s:div id="sdRerender" rendered="#{testController.testRerenderBool}">
                <h:selectBooleanCheckbox id="myscheckbox" value="#{testController.testBool}">
                    <a4j:support ajaxSingle="true" event="onclick" immediate="true"
                        status="globalStatus" action="#{testController.testCheckbox()}" />
                </h:selectBooleanCheckbox>
            </s:div>
        </s:div>
    </h:form>

My Java class:

@Name("testController")
@AutoCreate
public class TestController {

    private boolean testBool = false;

    public boolean isTestRerenderBool() {
        return testRerenderBool;
    }

    public void setTestRerenderBool(boolean testRerenderBool) {
        this.testRerenderBool = testRerenderBool;
    }

    private boolean testRerenderBool;

    public void switchtestRerenderBool(){
        System.out.println("switch");
        testRerenderBool = !testRerenderBool;       
    }

    public void testCheckbox(){
        System.out.println("drin");
    }

    public boolean isTestBool() {
        return testBool;
    }

    public void setTestBool(boolean testBool) {
        this.testBool = testBool;
    }
}

Solution

  • Okay, i got it working, with these changes:

    First i added @Scope(ScopeType.CONVERSATION) to the TestController

    @Name("testController")
    @AutoCreate
    @Scope(ScopeType.CONVERSATION)
    public class TestController {
    ...
    }
    

    And as a second change, I changed the <s:div to an <a4j:outputPanel

    <a4j:outputPanel id="sdBoolCheckboxtest">
    

    This solved my problem, but I'm still wondering why I need the @Scope(ScopeType.CONVERSATION) (I found the hint with the a4j:outputPanel here)

    Any explanation would be helpful, thanks!