Problema JBoss Seam - @In attribute requires non-null value:

1,136 views
Skip to first unread message

Joilton

unread,
Dec 4, 2009, 12:31:23 PM12/4/09
to javasf: JavaServer Faces Group
Boa tarde pessoal!

Meu primeiro post no grupo. Tô gostando muito do grupo, apredendo
muito.

Bem, sou iniciante com JBoss Seam. Estou migrando agora do Struts 2
para o Seam. Tô tendo minha primeira experiência fazendo um trabalho
para pós.

Bem, vou relatar problema que estou tendo. Tenho uma tela que tem um
único campo h:inputTextarea. Quando clico no botão "incluir"dá o
seguinte erro:

@In attribute requires non-null value: mensagemAction.mensagemAux

Seguem os códigos do EJB, do TO e a página xhtml:

************* TO*********************

@Entity
@Name("mensagem")
@Table(name = "mensagem")
@SequenceGenerator(name = "mensagem_id_seq", sequenceName =
"tuitaseam.mensagem_id_seq")
@NamedQueries({@NamedQuery(name="Mensagem.query.listarTodos",
query="select obj FROM Mensagem obj ORDER BY
obj.usuario.id"),
@NamedQuery(name="Mensagem.query.listarPorTexto",
query="select obj FROM Mensagem obj WHERE obj.texto
= :texto"),
@NamedQuery(name="Mensagem.query.listarColecaoPorTexto",
query="select obj FROM Mensagem obj WHERE obj.texto
= :texto"),
@NamedQuery(name="Mensagem.query.listarColecaoPorId",
query="select obj FROM Mensagem obj WHERE obj.usuarioId
= :usuarioId ORDER BY obj.id desc"),
@NamedQuery
(name="Mensagem.query.listarColecaoPorUsuarioNome",
query="select obj FROM Mensagem obj WHERE
obj.usuario.nome = :nome")
})
public class Mensagem implements Serializable {

private static final long serialVersionUID = -8542368196084952561L;

@Id
@GeneratedValue(generator = "mensagem_id_seq", strategy =
GenerationType.SEQUENCE)
@Column(name = "id", unique = true, nullable = false)
private Integer id;

private Integer usuarioId;

@OneToOne
@JoinColumn(name = "usuarioId", referencedColumnName = "id",
insertable = false, updatable = false)
private Usuario usuario;

@Column(name = "texto", nullable = false, length = 140)
private String texto;

@Temporal(TemporalType.TIMESTAMP)
private Date dataHora;

@Transient
private int flagExcluir = 0;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public Integer getUsuarioId() {
return usuarioId;
}

public void setUsuarioId(Integer usuarioId) {
this.usuarioId = usuarioId;
}

public Usuario getUsuario() {
return usuario;
}

public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}

public String getTexto() {
return texto;
}

public void setTexto(String texto) {
this.texto = texto;
}

public Date getDataHora() {
return dataHora;
}

public void setDataHora(Date dataHora) {
this.dataHora = dataHora;
}

public int getFlagExcluir() {
return flagExcluir;
}

public void setFlagExcluir(int flagExcluir) {
this.flagExcluir = flagExcluir;
}
}

************* EJB *********************

@Stateless
@Name("mensagemAction")
@TransactionAttribute(value = TransactionAttributeType.REQUIRED)
@Restrict("#{identity.loggedIn}")
public class MensagemActionBean implements MensagemAction {

@PersistenceContext
private EntityManager em;

@SuppressWarnings("unused")
@In
private FacesMessages facesMessages;

@DataModel
private List<Mensagem> mensagens;

@In(create = true)
@Out(required = false)
@DataModelSelection
private Mensagem mensagemAux;

public Mensagem getMensagemAux() {
return mensagemAux;
}

public void setMensagemAux(Mensagem mensagemAux) {
this.mensagemAux = mensagemAux;
}

@Factory(value = "mensagens")
public void listarMensagens() {

Usuario lUsuario = (Usuario) Contexts.getSessionContext().get
("usuarioSessao");

mensagens = lUsuario.getMensagens();

}

@Begin(join = true)
public String editar(Mensagem mensagem) {

em.refresh(mensagem);

this.mensagemAux = mensagem;

return ("editarMensagem");

}

public String remover(Mensagem mensagem) {

em.remove(mensagem);

return ("mensagens");

}

@End
public String incluir() {

Mensagem pMensagem = new Mensagem();

Usuario lUsuario = (Usuario) Contexts.getSessionContext().get
("usuarioSessao");

pMensagem.setDataHora(new Date());
pMensagem.setFlagExcluir(0);
pMensagem.setTexto(getMensagemAux().getTexto());
pMensagem.setUsuario(lUsuario);
pMensagem.setUsuarioId(lUsuario.getId());

em.persist(pMensagem);

return ("mensagens");

}

public List<Mensagem> getMensagens() {
return mensagens;
}

}

************* XHTML *********************

<!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/principal.xhtml">

<ui:define name="body">

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

<h:form id="MensagemForm">

<h:inputTextarea rows="3" cols="80" label="mensagem" value="#
{mensagemAux.texto}" id="text" />

<h:commandButton id="incluir" value="Incluir" action="#
{mensagemAction.incluir}"/>

<br/><br/><br/><br/>
<rich:dataTable value="#{mensagens}" var="mensagem"
id="tabelaMensagem" rows="5" columnClasses="dataCell">
<rich:column label="Usuario" id="colunaUsuario">
<f:facet name="header">
<h:outputText value="Usuario" />
</f:facet>
<h:outputText value="#{mensagem.usuario.nome}"/>
</rich:column>
<rich:column label="Texto" id="colunaTexto">
<f:facet name="header">
<h:outputText value="Texto" />
</f:facet>
<h:outputText value="#{mensagem.texto}"/>
</rich:column>
</rich:dataTable>
<rich:datascroller for="tabelaMensagem"></rich:datascroller>



</h:form>

</rich:panel>

</ui:define>

</ui:composition>


************* listarMensagens.page.xml *********************

<?xml version="1.0" encoding="UTF-8"?>
<page xmlns="http://jboss.com/products/seam/pages"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.com/products/seam/pages
http://jboss.com/products/seam/pages-2.2.xsd">

<navigation from-action="#{mensagemAction.incluir}">
<rule if="#{identity.loggedIn}">
<redirect view-id="/listarMensagens.xhtml"/>
</rule>
</navigation>


</page>

*****************************************************************

Desculpem o tamanho da mensagem. É que como é o primeiro post não sei
se fiz de forma correta.

Desde já agradeço a atenção.

Abraços,

Joilton Almeida.

Assis Júnior

unread,
Dec 4, 2009, 1:19:46 PM12/4/09
to jav...@googlegroups.com
Kra tenta colocar

@In(create = true)
@Out(required = false)
@DataModelSelection
private Mensagem mensagem; <<<<

ao inves de

@In(create = true)
@Out(required = false)
@DataModelSelection
private Mensagem mensagemAux; <<<<

Diz se deu certo.

2009/12/4 Joilton <joi...@gmail.com>:
--
Atenciosamente,
Assis júnior
SCJP 5.0 Certified

Doglas Maccari

unread,
Dec 4, 2009, 1:20:17 PM12/4/09
to jav...@googlegroups.com
Joilton,

Vc injetou um recurso que está sendo usado pela primeira vez na sua conversation, então, sugiro que verifique se vai usá-lo mesmo em sua classe e se for, tente inicialiazá-lo desta forma:

@In(create = true)

Essa annotation injeta um objeto do tipo em questão(FacesMessages) na sua conversation atual. O parâmetro create = true faz com que ele seja inicializado caso esteja nulo, ou seja, será inicializado somente se não foi inicializado por outra classe durante a conversation atual.

valeu.

2009/12/4 Joilton <joi...@gmail.com>

Joilton

unread,
Dec 4, 2009, 2:05:24 PM12/4/09
to jav...@googlegroups.com
Assis,

funcionou da forma como você falou. Alterei o nome da propriedade mensagemAux para mensagem e funcionou. Pra falar a verdade nem sei porque coloquei esse Aux hehehe.

Muito obrigado pela atenção.

Obrigado também Doglas por ter respondido.

Abraço a todos.

Assis Júnior

unread,
Dec 4, 2009, 2:34:32 PM12/4/09
to jav...@googlegroups.com
Ok. O @In funciona verificando o nome da variavel que vc colocou.
Verifiquei no @Name voce tinha colocado um nome e no @In outro ai o
seam não conseguia identificar qual componente criar.

Para colocar um nome diferente na variavel voce pode usar assim
@In("mensagem") Mensagem mensagemAux;

Abaixo segue uma lista dos atributos da annotation.

create: Cria o componente automaticamente caso não encontre no
contexto. Um ponto importante para se observar é que ele somente cria
componentes do seam. Classes que não são componentes do seam não são
criadas.
required: Se true indica que o campo não deve ser null quando o
componente for chamado.
scope: Indica em qual escopo encontrar o componente.

[]´s

2009/12/4 Joilton <joi...@gmail.com>:

Pablo Borges

unread,
Dec 5, 2009, 12:04:09 PM12/5/09
to jav...@googlegroups.com
Aproveitando,

Eu preciso necessariamente utilizar os recursos de bi-injection ( @In
ou @Out) ???

Não basta eu criar um get e um set para a propriedade mensagem.

Ex:.

@Named("ex")
public class Ex ... {

private Mensagem mensagem;

}

obtendo o acesso através de:

ex.mensagem ??

Existe alguma regra para se usar bi-injection @In ou @Out ?

2009/12/4 Assis Júnior <assi...@gmail.com>:

Assis Júnior

unread,
Dec 5, 2009, 1:44:43 PM12/5/09
to jav...@googlegroups.com
Você pode usar só o @In ou somente o @Out. Não é obrigado usar os 2
simultaneamente.

Somente colocando o get/set não funciona porque o seam não vai saber
se deve ou não injetar o componente. Vc colocando os get/set/is o
campo vai se tornar uma propriedade javabeans no componente. Assim se
vc quizer poderá em um outro componente usar ex.mensagem como você
falou, mas não estará usando os recursos do container do seam e sim um
java bean.

Então se por exemplo vc fizer assim:

@Name("component1")
public class Component1{

private String texto01;
//get/set...

//...
}

@Name("component2")
public class Component2{

private Component1 component1;

//get/set

@Begin
public void incluir(){
component1.ativar(); //<< Aqui vai lançar null pointer exception
porque como não tem o @In o seam não sabe que tem de injetar o
componente mesmo que possua os get/set/is.
}

}

Porém se você injetá-los manualmente e usar:

//xxxView.xhtml

<h:inputText value="component2.component1.texto01" />

<h:commandButton action="#{component2.incluir}" />

[]´s

2009/12/5 Pablo Borges <pablos...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages