2009-09-06 7 views
0

I a généré un nouveau formulaire en utilisant sean-gen (couture nouvelle forme) et un autre champ ajouté à l'aide d'une annotation @In:JBoss Seam - Les annotations Can not @In peuvent-elles être utilisées en même temps avec des méthodes d'accès pour différentes propriétés?

@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() {} 

} 

L'interface est celle-ci:

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

Le problème est, lorsque je tente d'accéder aux propriétés que je reçois:

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) 

Mon opinion est la suivante:

<!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> 

Si je retire soit « fooField » ou «Barfield la vue et fonctionne correctement rend, mais si je tente d'utiliser les deux en même temps je reçois l'exception ci-dessus.

J'ai également remarqué que si j'utilise seulement les annotations @In (supprimer les méthodes d'accès du bean) la page fonctionne.

Est-ce quelque chose d'attendu et je devrais faire mes devoirs avant de demander?

J'utilise JBoss 5.1.0.GA, Seam 2.2.0.GA et Java 6.

Répondre

2

Transforme ce comportement est normal, citant une réponse du seam forum:

Utilisation @In (required = false) si le composant Seam que vous injectez n'a pas l'annotation @AutoCreate au niveau de la classe.

Ainsi, le changement:

@In private String bar; 

à:

@In (required=false) private String bar; 

résout le problème.

Questions connexes