Olá pessoal, eu baixei a aplicacao da loja virtual feita com JSF + Spring-Annotation mas nao encontrei em nenhum lugar o que exatamente cada coisa faz.
Por exemplo nesse managed bean:
@Bean(name = "cadProd", scope = Scope.SESSION)
public class CadProdutos {
private RsjugBaseDao<Produto, Long> produtoDao;
@DataModel
private List<Produto> produtos;
@DataModelSelection
// @Out
// @Value("#{produto}")
@Valid
private Produto produto;
private UploadedFile uploadFile;
public UploadedFile getUploadFile() {
return uploadFile;
}
public void setUploadFile(UploadedFile uploadFile) {
this.uploadFile = uploadFile;
}
public Produto getProduto() {
return produto;
}
public void setProduto(Produto produto) {
this.produto = produto;
}
public RsjugBaseDao<Produto, Long> getProdutoDao() {
return produtoDao;
}
public void setProdutoDao(RsjugBaseDao<Produto, Long> produtoDao) {
this.produtoDao = produtoDao;
}
public List<Produto> getProdutos() {
return produtos;
}
public void setProdutos(List<Produto> produtos) {
this.produtos = produtos;
}
public String criar() {
produto = new Produto();
return "def:form";
}
@IfInvalid
public String salvar() {
if (uploadFile != null && uploadFile.getSize() > 0) {
try {
produto.setImage(uploadFile.getBytes());
produto.setContentType(uploadFile.getContentType());
} catch (IOException e) {
e.printStackTrace();
}
}
if (produto.getId() == null) {
produtoDao.save(produto);
} else {
produtoDao.update(produto);
}
return "def:form";
}
public String deletar() {
produtoDao.delete(produto);
return "def:form";
}
public String editar() {
return "def:form";
}
public String listar() {
produtos = produtoDao.listAll();
return "def:list";
}
}
para que servem as anotacoes @DataModel e @DataModelSelection?
e a anotacao @Valid do hibernate, o que ela faz no managed bean?
além disso tem a anotacao @IfInvalid, que eu também nao sei o que que faz…
o pra finalizar, como que funciona a navegacao do JSF usando Spring-Annotation já que nao tem nada no faces-config.xml?
Pelo que vi aqui, tem esse "def:list" e "def:form" que por convencao procura a pagina list ou form dentro da pasta com o nome do managed bean. E isso mesmo? E como fica nos demais casos onde eu quero enviar para uma outra pagina qualquer, como eu faço a restricao sem faces-config?
Só pra fazer um paralelo, usando XDoclet eu fazia assim
/**
* @jsf.bean name="nomeManagedBean" scope="request"
* @jsf.navigation from="*" to="/pastaManagedBean/paginaManagedBean.jsp" result="fromOutcomeManagedBean"
*/
como ficaria com o Spring-Annotation?
Eu pergunto pois pelo que andei vendo nao tem muita documentacao né, inclusive o próprio Urubatan falou isso.
Tenho muito interesse de aprender, pois parece que deixa as coisas bem mais ágeis na ora de desenvolver.
valeu pessoal, aguardo a resposta de quem puder ajudar.
E dependendo de como for, eu gostaria de poder escrever alguns tutoriais passo a passo para ajudar a documentar essa ferramenta que pra mim, mesmo ainda sem saber como usar, se fizer o que esta parecendo, para mim vai ser ótimo.
bom, começando do começo então D
@DataModel disponibiliza aquela lista como um ListDataModel para que tu acesse #{produtos} como value para um dataTable
a vantagem disto, é que quando tu clicar em um commandLink ou commandButton em uma linha da tabela, o campo anotado com @DataModelSelection vai ser preenchido automagicamente com o valor daquela linha da lista …
o @IfInvalid (que aceita um parametro opcional outcome) diz que o managedbean precisa ser validado antes de executar aquela action (a validação é feita usando o hibernate validator)
então o @Valid faz a mesma coisa que no hibernate validator, ou seja, diz que Produto tem que ser valido para este mbean ser valido.
só serão considerados na validação os campos que estiverem na tela, ou seja, campos para os quais existir um input qualquer com o value apontando para eles.
quanto a navegação …
pode ser utilizado o faces-config.xml sem problema nenhum …
mas o Spring-Annotation traz um navigation handler pra facilitar a vida que faz o seguinte …
se o método action retornar "def:qualquer coisa"
a página que vai ser renderizada vai ser:
/nomeDoManagedBean/qualquercoisa.jsp
bem parecido com o que a ultima versão do VRaptor esta fazendo …
não sei se foram resolvidas todas as duvidas, mas quaquer coisa é só perguntar 
ahh, e mais uma coisa …
arrumei um tempo para alterar o projeto para utilizar o maven 2.
separei em modulos (core, jsf, hibernate, web, …)
e com isto estou começando a escrever a parte de documentação (pelo menos alguma coisa)
então em no máximo um mes ja deve estar sainda alguma coisa de documentação e um site novo (tudo bem, naquele layout meia boca gerado pelo maven
)
Valeu Urubatan, eu vou dar mais uma olhada naquele tutorial do RSJUG e conforme for aparecendo as duvidas eu posto aqui. Mas por enquanto as respostas já valeram.
E parabéns pelo projeto 
Dentro do DAO, no metodo save nao estava funcionando e estava assim
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public T save(final T object) {
try {
System.out.println("RsjugBaseDaoImpl.save()");
this.getSession().save(object);
return object;
} catch (final HibernateException e) {
throw convertHibernateAccessException(e);
}
}
e eu olhando o metodo upadate, que funcionava tinha um session.flush()…
entao eu coloquei ele no save também e entao funcionou, ficando assim
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public T save(final T object) {
try {
System.out.println("RsjugBaseDaoImpl.save()");
this.getSession().save(object);
this.getSession().flush();
return object;
} catch (final HibernateException e) {
throw convertHibernateAccessException(e);
}
}
A minha duvida é se isso deveria ser assim mesmo ou nao. Nos meus DAOs genericos eu geralmente tenho uma transaction envolvendo o metodo save e isso é o suficiente para persistir os dados, entao pensei q a anotacao @Transaction garantisse o mesmo comportamento, mas pelo jeito funciona um pouco diferente e eu acabo tento q chamar o flush.
Sendo assim eu sempre vou ter q colocar flush no meu DAO?
E outra perguntinha com relacao às dependencias…
Toda vez que eu tiver um setAlgumaCoisa e o spring-annotation encontrar um @Bean(“algumaCoisa”) ele vai chamar meu set passando esse objeto? Como que isso funciona?
quanto ao flush, é algum bug no exemplo :S sorry …
(juro que quando eu testei o save tava funcionando :roll: )
e quanto a segunda pergunta sim …
isto enquanto não for setado o autoWire=none no @Bean
para fazer isto é utilizado o autowire do spring, ou seja, da pra fazer a mesma coisa com XML 
Como eu disse antes, conforme eu vou mexendo as duvidas vao aparecendo… 
no exemplo, eu tenho isso
@DataModel
private List<Produto> produtos;
@DataModelSelection
@Valid
private Produto produto;
sobre isso eu tenho duas perguntas, como a lista produtos é inicializada e como da minha jsp eu só referencio #{produtos} sem precisar colocar o nome do managed bean?
Com relacao a primeira pergunta, parace que no Seam tem uma anotacao que serve para inicializar esses casos, ficaria mais ou menos assim:
@Factory("produtos")
public void fundProdutos()
{
this.produtos = dao.findAll();
}
Aí fiquei na duvida de como isso é inicializado no Spring-Annotation, e se for algo automatico onde ele lista todos, nao teria como fazer algo personalizado como com esse find?
No Spring-Annotation nao tem nada parecido para eu usar com um combo-box em vez de um dataTable?
Bom, antes que voce responda a pergunta anterior deixa eu adiantar a proxima :oops:
se eu uso autoWire=none no @Bean tem outra forma deu conseguir injetar ele no meu objeto ou o spring-annotation trabalha especificamente com autoWire?
to perguntando mais pra saber mesmo, porque na pratica acredito que com autoWire consiga fazer tudo que eu quero.
Valeu Urubatan, to gostando desse negócio… 
se usar o autowire=none ai tu pode começar a usar as anotações
@Value("#{qualquer expressão da EL do JSF}")
ou então @Property especificando value ou ref value para o valor fixo e ref para referenciar outro bean
na versão do spring-annotation que esta disponivel para download não existe ainda o @Factory
mas no trunk do SVN no @DataModel tem um parametro factory, que aponta para um metodo de qualquer mbean usando EL, e este metodo vai ser chamado quando não existir a variavel, semelhante ao @Factory
espero conseguir liberar a proxima versão na semana que vem …
Mas no caso de exemplo do RSJUG (ou outro exemplo) como que esta sendo iniciada a lista já que ainda nao tem factory?
[quote=urubatan]
ahh, e mais uma coisa …
arrumei um tempo para alterar o projeto para utilizar o maven 2.
separei em modulos (core, jsf, hibernate, web, …)
e com isto estou começando a escrever a parte de documentação (pelo menos alguma coisa)
então em no máximo um mes ja deve estar sainda alguma coisa de documentação e um site novo (tudo bem, naquele layout meia boca gerado pelo maven
)[/quote]
Cara deixa eu te perguntar uma coisa gostaria de saber quando vai mexer neste projeto??? gostaria de sugerir q aproveita-se a oportunidade para fazer um video aula tipo este: http://www.paulojeronimo.com/tutoriais/tutorial-ejb3/videos/01-configuracao-jboss.html
se tiver interese eu tenho o software e posso te passar fiquei muito curioso com alguns recursos q vc usa como o Spring-Annotation e o Facelets gostaria de aprender mais sobre os mesmos e o seu tutoria pode ajudar.
apropósito de a sua contribuição no tópico http://www.guj.com.br/posts/list/43023.java pois com a sua bagagem e experiência seria fundamental para abrir novos horizontes para nós iniciante.
fico aguardando sua resposta
no caso deste exemplo tem que passar por uma action antes de ir pra JSP 
sim, eu sei que é feio …
hehehe, esquenta nao, pelo q vc falou, logo logo sai a versao com factory 
até lá eu vou aprendendo as outras coisas hehehe.
valeu Urubatan.
[quote=robson_vs]
Cara deixa eu te perguntar uma coisa gostaria de saber quando vai mexer neste projeto??? gostaria de sugerir q aproveita-se a oportunidade para fazer um video aula tipo este: http://www.paulojeronimo.com/tutoriais/tutorial-ejb3/videos/01-configuracao-jboss.html
se tiver interese eu tenho o software e posso te passar fiquei muito curioso com alguns recursos q vc usa como o Spring-Annotation e o Facelets gostaria de aprender mais sobre os mesmos e o seu tutoria pode ajudar.
apropósito de a sua contribuição no tópico http://www.guj.com.br/posts/list/43023.java pois com a sua bagagem e experiência seria fundamental para abrir novos horizontes para nós iniciante.
fico aguardando sua resposta[/quote]
como assim? não entendi a pergunta …
vou ver se é possivel fazer uma video aula
é q se quizer tenho o software para fazer este video aula e posso te passar
Nossa, fiz tanta pergunta em uma só que acabei me perdendo :lol:
Como mesmo que a pagina encontra o #{produtos} sem passar o nome do managed bean? pois vi que em outro managed bean tem um atributo com o mesmo nome e mesma anotacao, entao como saber quem é quem? pelo caminho da pagina? (já que segue convencoes)…
a outra questao é essa:
Seria uma mao na roda se tivesse algo assim, usando aquela anotacoes @DataModel e @DataModelSelection (mesmo que o nome da anotacao fosse diferente).
Mas aí teria que tratar o caso de voce ter dois combos no mesmo managed bean, e isso também pode acontecer com o dataTable… tem como eu falar no meu @DataModelSelection que @DataModel ele está referenciando?
bom, depois de mais essas acho que as perguntas acabaram hehhee
Sepois de passar por uma action em um managed bean que tem o @DataModel, é criada uma variavel no escopo de flash contendo um ListDataModel que contem o valor daquela propriedade.
[quote=gilliard_santos]
No Spring-Annotation nao tem nada parecido para eu usar com um combo-box em vez de um dataTable?
Seria uma mao na roda se tivesse algo assim, usando aquela anotacoes @DataModel e @DataModelSelection (mesmo que o nome da anotacao fosse diferente).
Mas aí teria que tratar o caso de voce ter dois combos no mesmo managed bean, e isso também pode acontecer com o dataTable… tem como eu falar no meu @DataModelSelection que @DataModel ele está referenciando?
bom, depois de mais essas acho que as perguntas acabaram hehhee[/quote]
Para o combo ainda não tem não …
mas é uma ideia interessante para a proxima versão.
e não tem encessidade de tratar quando houver mais de um por managed bean, ja que a propriedade value do combo box ja resolveria isto 
é verdade, nao faz o menor sentido o que eu disse com relacao ao combo-box hehehe… é que na verdade eu taa pensando no dataTable hehehe
com relacao ao combo esquece o que eu disse, mas como fica numa pagina que tem dois dataTable? Por exemplo eu posso ter um tabbedPane e em tabs diferentes ter dataTables para o mesmo tipo ou tipo diferente de objetos, e nesse caso como eu ligo um @DataModel com seu respqectivo @DataModelSelection?
ja adiantei o fato de ter dataTable em duas tabs diferentes porquer realmente poderia ficar bem esquisito ter um dataTable em baixo do outro, e no caso do uso das tabs, o conteúdo de todas elas sao carregadas de uma vez (eu prefiro assim do que carregar a cada mudançca de tab), entao na pratica é um monte de dataTable na mesma pagina.