JBoss Seam - Kann nicht @in Anmerkungen zur gleichen Zeit mit Accessormethoden für verschiedene Eigenschaften verwendet werden?

StackOverflow https://stackoverflow.com/questions/1385208

Frage

I erzeugen ein neues Formular Sean-gen (Naht new-Form) und ein weiteres Feld, um es unter Verwendung einer @in Annotation hinzugefügt:

@Stateful
@Name("dummy")
public class DummyBean implements Dummy
{
    @Logger private Log log;

    @In StatusMessages statusMessages;

    @In private String bar;

    private String foo;

    public void doStuff()
    {
        String msg = "dummy.doStuff() action called with foo: #{dummy.foo} and bar: #{bar}. instance variable for bar:" + bar;
        log.info(msg);
        statusMessages.add(msg);
    }

    @Length(max = 10)
    public String getFoo()
    {
        return foo;
    }

    public void setFoo(String value)
    {
        this.foo = value;
    }

    @Remove
    public void destroy() {}

}

Die Schnittstelle ist diese:

@Local
public interface Dummy
{
    public void doStuff();
    public String getFoo();
    public void setFoo(String value);
    public void destroy();
}

Das Problem ist, wenn ich versuche, auf die Eigenschaften zuzugreifen, erhalte ich:

javax.faces.FacesException: javax.el.ELException: /dummy.xhtml @22,52 value="#{dummy.foo}": Error reading 'foo' on type org.javassist.tmp.java.lang.Object_$$_javassist_seam_2
    at javax.faces.component.UIOutput.getValue(UIOutput.java:187)
    at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:201)
    at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:284)
    at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:154)
.
.
.
Caused by: javax.ejb.EJBTransactionRolledbackException: @In attribute requires non-null value: dummy.bar
    at org.jboss.ejb3.tx.Ejb3TxPolicy.handleInCallerTx(Ejb3TxPolicy.java:115)
    at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:130)

Meine Ansicht ist dies:

<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:s="http://jboss.com/products/seam/taglib"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:a="http://richfaces.org/a4j"
    template="layout/template.xhtml">

<ui:define name="body">

    <h:form id="dummyForm">

        <rich:panel>
            <f:facet name="header">dummy header</f:facet>

             <s:decorate id="fooField" template="layout/edit.xhtml">
                <ui:define name="label">Foo</ui:define>
                <h:inputText id="foo" required="true"
                             value="#{dummy.foo}"/>
            </s:decorate>               

             <s:decorate id="barField" template="layout/edit.xhtml">
                <ui:define name="label">Bar</ui:define>
                <h:inputText id="bar" required="true"
                             value="#{bar}"/>
            </s:decorate>            

            <div style="clear:both"/>

        </rich:panel>

        <div class="actionButtons">
            <h:commandButton id="doStuff" value="doStuff"
                    action="#{dummy.doStuff}"/>
        </div>

    </h:form>

</ui:define>

</ui:composition>

Wenn ich entfernen entweder ‚ fooField ‘ oder ‚ Barfield ‘ die Ansicht macht und funktioniert einwandfrei, aber wenn ich versuche, beide zur gleichen Zeit zu nutzen, erhalte ich die oben Ausnahme.

Ich habe auch bemerkt, dass, wenn ich nur @in Anmerkungen (die Zugriffsmethoden aus der Bohne entfernen), um die Seite funktioniert.

Ist das etwas erwartet und ich meine Hausaufgaben tun, bevor Sie fragen?

Ich verwende JBoss 5.1.0.GA, Seam 2.2.0.GA und Java 6.

War es hilfreich?

Lösung

Stellt sich heraus, das ist das erwartete Verhalten, zitiert eine Antwort von der Naht Forum :

  

Mit @in (required = false), wenn die Naht Komponente Sie sind injizierende nicht die @AutoCreate Anmerkung auf Klassenebene hat.

So, Ändern:

@In private String bar;

zu:

@In (required=false) private String bar;

behebt das Problem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top