JBoss Seam - ne peut pas être utilisé @In annotations en même temps avec les méthodes d'accès pour des propriétés différentes?
-
21-09-2019 - |
Question
I a généré un nouveau formulaire en utilisant sean-gen (couture nouvelle forme) et ajouté un autre champ à l'aide d'une annotation @In:
@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 point de vue est le suivant:
<!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 rend et fonctionne correctement, mais si je tente d'utiliser les deux en même temps je reçois ci-dessus exception.
J'ai aussi remarqué que si je n'utilise que @In annotations (supprimer les accesseurs de la fève) la page fonctionne.
Est-ce quelque chose de prévu et que je devrais faire mes devoirs avant de demander?
J'utilise JBoss 5.1.0.GA, Seam 2.2.0.GA et Java 6.
La solution
Transforme ce comportement est normal, citant une réponse de la forum de couture de :
Utilisez @In (obligatoire = false) si le composant de Seam vous injecter ne pas l'annotation @AutoCreate au niveau de la classe.
Alors, changer:
@In private String bar;
à:
@In (required=false) private String bar;
résout le problème.