Mensagens enviadas por: rponte
Índice dos Fóruns » Perfil de rponte » Mensagens enviadas por rponte
Autor Mensagem
Concordo com o ruivo, provavelmente a sua regra está no lugar errado - mas isso é apenas a visão minimalista que tenho do seu modelo de negócios.

No mais, talvez seja melhor colocar no repositório de Vendas ou Pedidos, novamente depende.

Se ainda assim você tiver necessidade e interesse que a regra continue na sua entidade produto, aconselho você tentar umas das alternativas abaixo:
1) Use a anotação @Formula - http://stackoverflow.com/questions/2986318/calculated-property-with-jpa-hibernate ;
2) Passe um repositório para o método getter, algo como produto.getDataDaUltimaVenda(repositorio) ;

Um abraço.

ruivo wrote:
danilo.magrini wrote:
Aqui é onde entra as enormes discussões sobre arquitetura. Ao meu ver é responsabilidade sim do Produto saber a dataUltimaVenda, pois se isso fere o princípio da responsabilidade única então teriamos que ter objetos ProdutoCodigo, ProdutoDescricao, ProdutoPreco, ProdutoUnidade, etc;


De maneira alguma. O que é uma venda? Nada mais é que um pedido finalizado. E é um pedido que tem um produto, não o contrário. Pensa numa garrafa. Ela não tem gravada nela quando foi vendida. Agora, se pensar na nota fiscal, lá estarão as referências para os produtos que foram vendidos, com as datas e valores pagos pelo consumidor.

Se você quiser saber qual a data que um produto foi vendido pela última vez, você deve perguntar para os pedidos (ou notas fiscais) qual a última vez que aquele produto aparece, e não perguntar pro produto quando ele foi vendido, que não faz muito sentido.
Oi rbortolon,

Se você estiver trabalhando com JSF2 você pode utilizar o escopo FLASH para prolongar mensagens e objetos durante redirecionamentos. Dá uma pesquisa sobre isso, com certeza é melhor do que implementar seu próprio phase-listener.

O código seria algo do tipo:


rbortolon wrote:
Olá a todos,

Me diz aí David, conseguiu resolver o seu problema ?

Eu estou enfrentando o mesmo. Meu código no managedBean está identico ao seu no caso de mostrar a mensagem e o redirect que no meu caso faço da seguinte forma -> return "/pages/login?faces-redirect=true" (meu formulário é um form de registro de usuário que redireciona para a página de login após sucesso)

Rafael, você mencionou que as mensagens ficam no escopo Request certo? O meu bean esta com este escopo mas mesmo assim, ao salvar os dados do formulário (clicar no botão ok) não mostra a mensagem. Só redireciona como mencionei no parágrafo acima. Vi alguns casos em que falaram que tenho que implementar um PhaseListener para recuperar as mensagens mas daí envolve ter que inserir a config no faces-config e eu não estou utilizando o faces-config pois um dos propósitos do JSF 2 é justamente não precisar dele certo? Bom, se precisar tudo bem, não que eu seja contra mas gostaria de saber se há uma solução diferente para este problema.

Obrigado!
Sds,
Rodrigo
Olá asousaj,

Não sei bem qual o propósito da tua aplicação e como ela seria melhor modelada de acordo com o contexto e domínio. O código que você postou parece está simples e suficiente para tuas necessidades. Talvez deixar toda a lógica de calculo dentro do seu "MyCalcMath" não seja o ideal, pois pode haver dificuldades quanto a escrita de testes de unidade.

Mas aconselho a leitura desse post sobre como implementar melhor seus managed beans. Espero que te ajude!

Um abraço e boa sorte!



asousaj wrote:Caros,
to criando uma aplicação para otimizar o trabalho aqui na empresa, coisa simples, e gostaria de uma dica quanto à estrutura que usei, se pode ser melhorada.
A aplicação consiste em 15 paginas(jsf) com forms para calculos. Não usarei DB, sem login, coisa bem simples.

Exemplo:







Bom pessoal é isso, onde posso melhorar na estrutura ... os codigos do projeto sao similares a estes.

Grato a todos!
Só para constar: escrevi um post sobre o assunto,
http://www.rponte.com.br/2011/06/07/limpando-a-arvore-de-componentes/

nei.junior wrote:
Enfim, agora que ficou claro vamos elaborar a melhor forma de trabalhar para resolver isso.

Normalmente eu limpo o formulário de maneira explicita antes de navegar para alguma página (exibir o formulário), algo como,
https://github.com/rponte/jsf-loja-project/blob/master/src/br/com/triadworks/loja/controller/ProdutoBean.java#L46

Enfim, é um reset forçado da árvore de componentes

Um abraço.
nei.junior wrote:Rafael,

Bom concluindo o assunto, entendi. Você deu uma boa clareada neste caso.
Agora vamos ver uma das soluções postada no inicio por você.
O @DaniloMagrini deu uma ideia de propor na lista oficial do Mojarra a criação de algo como:


O que acha ? Acho que quando cair nessa situação, pelo menos teria uma forma mais simples e objetiva de contornar.



Nei,

Antes de mais nada, é importante definir bem o que "invalidar" significa. Significa recriar toda a árvore de componentes? Limpar o estado interno de todos os inputs ou todos os componentes?

O pessoal do Trinidad criou algo semelhante, mas acho que somente para inputs, não me recordo. Tanto que foi incorporado ao JSF 2.x. Se eu pesquisar talvez até ache o artigo.

No mais, eu acredito que você não queira invalidar toda a árvore de componentes, mas sim alguns componentes ou grupo de componentes. Então utilizar navegação é a solução mais simples e o próprio faces já te fornecesse isso.

Enfim, provavelmente há uma forte razão para o ciclo de vida e os componentes trabalharem assim! Se você souber de algo no forum não deixe de me informar.
danilo.magrini wrote:
O ideal é procurar isso na especificação. Assim que eu tiver um tempo vou vasculhar entre as JSRs 314, 127 e 252 e ver se encontro algo. Porém se fosse para apostar eu apostaria que ele é setado depois da conversão porque pra mim setar o local value depois da validação se tornaria desnecessário uma vez que ele seria setado e logo em seguida receberia null já que o modelo seria atualizado.


Mas é como eu te disse, Danilo, após a validação, dentro da PROCESS VALIDATION, ainda podem ocorrer diversos eventos antes da atualização do modelo. Nesse curto intervalo o modelo precisa estar integro para que alguns eventos funcionem corretamente, como o valueChangeEvent, por exemplo.
nei.junior wrote:
Rafael,

Entendi sim, porém essa questão do AJAX foi o que pensei por priemiro. Portanto nesse exemplo que criei, não sei se você baixou ai, mas se sim pode observar que eu NÃO utilizo AJAX, é tudo requisição normal para recarregar a página toda e mesmo assim continua errado.
Como não é AJAX ele recarrega toda a página novamente, correto ? Com isso ele deveria reconstruir tudo novamente e vir correto, não é ?

Obrigado por enquanto !

Abraço.


Nei,

Eu havia baixado sim seu código. Quando comentei sobre o AJAX foi somente para reforçar, pois normalmente o problema ocorre quando utilizamos muito AJAX. Mas como eu havia dito, seja requisição comum ou AJAX, você continua trabalhando com a mesma árvore de componentes. No seu método editar() você retorna null como regra de navegação, simbolizando para o faces navegar para a mesma página, porém utilizando a mesma árvore de componentes em vez de recriar uma nova árvore.

O problema real está na árvore de componentes "suja". Nas soluções que eu havia dado mais acima eu comentei sobre utilizar a navegação do faces, mas sem retornar null.

nei.junior wrote:
* Agora no momento que cliquei no botão "Editar" do nome "MARIA" ele atualizou o modelo, significa que ele executou todos os outros processos corretamente, ou seja, o "Submitted Value" e o "Local Value" estão como "NULL".
Agora porque que na tela continua errado ? Não era para vir certo ?

Obrigado por enquanto !



Nei,

Lembre-se que a árvore de componentes ficou "suja" após o erro de validação (mas especificamente os inputs do formulário), e o que você fez após clicar no botão "Voltar" foi apenas esconder o formulário (rendered=false). O formulário, independente de quantas requisições AJAX ocorram, ainda permanece "sujo" em memoria e seus componentes de inputs não são processados no ciclo de vida pois o componente parent está rendered=false, por isso os valores internos não mudam (que já estavam "sujos" com o local value antigo, caindo naquela ordem de prioridade do valores: local value antes do model value).

Não sei se ficou claro. Caso tenha ficado confuso é só falar que tento explicar melhor.

Um abraço.
Oi Danilo,

danilo.magrini wrote:
Só fazendo uma observação aqui Rafael, o local value é setado logo após o submitted value ser convertido (se existir um converter associado) e sequer atinge o estágio de validação pois se assim fosse o local value nunca serviria pra nada já que se a conversão foi correta e a validação também então o modelo já seria atualizado e o local value passaria para null correto?


Na verdade eu gostaria de garantir isso para você, mas já li artigos que afirmam que o local value é setado após a validação e outros dizem que é setado logo após a conversão, na qual a validação só cuidaria de invalidar o componente. Mas no geral, para nós "usuários" do framework que não criamos componentes não faz tanta diferença assim. No mais, o local value também é utilizado para eventos que ocorrem imediatamente após a conversão e validação dentro da própria fase de validação, como por exemplo valueChangeListener's.
Olá nei.junior,

Antes de mais nada, esse problema não está relacionado somente a validação "required", mas sim qualquer erro na fase de validação (seja conversação ou validação).

Vou tentar explicar de maneira simples, o problema e as possíveis soluções que eu conheço.

Os componentes de inputs (todos que implementam EditableValueHolder) possuem 3 (três) tipos de valores que são alterados durante o ciclo de vida de uma requisição, eles são:
1) Submitted Value
2) Local Value
3) Value Binding (aka model value)

Vamos entender agora como esses 3 valores mudam nos componentes durante o ciclo de vida:

** Quando você submete um formulário todos os inputs da página são submetidos como String (parâmetros de request) e na APPLY REQUEST VALUES (2a fase) este valores são setados nos seus devidos componentes de inputs como "submitted value";

** Após isso, na fase de validação (3a fase), cada componente de input tenta converter e validar seu submitted value, em caso de sucesso o componente define seu novo valor convertido como "local value" e seta para null seu submitted value, continuando assim o ciclo de vida. Em caso de erro de conversão ou validação o componente não define seu "local value" e marca o componente como invalido, que por fim pula para última fase (RENDER RESPONSE);

** Se não houver erro na fase de validação o ciclo de vida continua na UPDATE MODEL VALUES para popular o modelo (managed bean etc), para cada componente de input setado no modelo o seu "local value" é setado para null e o ciclo termina na RENDER RESPONSE exibindo os valores do modelo (através das EL's);

O "problema" realmente ocorre na RENDER RESPONSE porque o componente pode retornar qualquer um dos 3 valores, contudo seguindo essa ordem de prioridade:

** Se houver submitted value então retorne-o;
** Caso contrário, se o local value é não nulo então retorne-o;
** Caso contrário, avalie a EL, ou seja, chame o getter do modelo;

Entendendo essa prioridade acima você mata a charada do problema

Esse problema ocorre muito comumente quando trabalhamos com a mesma árvore de componentes, ou seja, quando utilizamos muito AJAX e/ou navegação orientada a estados. Quando utilizamos a navegação padrão do JSF dificilmente caímos nesse problema.

Todas as soluções que conheço envolve limpar a árvore de componentes que está "suja":

1) Navegação padrão do Faces para recriar toda a viewroot (não vale retornar null);
2) Limpar de maneira educada todos os componentes de inputs;
3) Limpar os inputs de maneira "brute force" (parentComponent.getChildren().clear() - eles serão recriados na RENDER RESPONSE novamente, porém só funciona com JSF 1.x, pois o 2.x parece seguir corretamente a spec);

Eu acho que acabei falando de mais, isso daria até um post no blog, mas a preguiça nunca me deixou escrever, rss.

No mais, segue alguns links para complementar o que eu disse,
http://cagataycivici.wordpress.com/2005/12/28/jsf_component_s_value_local/
http://ovaraksin.blogspot.com/2010/06/submitted-value-local-value-model-value.html
http://stackoverflow.com/questions/260094/jsf-getvalue-v-s-getsubmittedvalue

Um abraço e espero que tenha ficado claro!
Apenas um detalhe: o problema do open session in view tambem ocorre com frameworks action-like. Nao eh especifico do faces somente.

Alem do que, se nao estou enganado, esse pattern abre uma session do Hibernate, nao necessariamente uma transaçao com o banco a cada request.
Olá,

Algumas vezes simplesmente limpar os dados do managed bean e repintar o formulário não é suficiente para limpar os valores dos componentes, principalmente depois de algum erro de validação/conversão.

Sendo, sempre ao submeter um formulário para que o mesmo seja limpo você precisa limpar os dados no managed bean e também limpar os dados "sujos" da árvore de componentes. Limpar os dados do managed bean é bem simples, mas para limpar a árvore de componentes vocês podem se utilizar desse método: https://github.com/rponte/jsf-loja-project/blob/master/src/br/com/triadworks/loja/util/FacesUtils.java#L58

Um método que limpa um formulário seria semelhante a este,
https://github.com/rponte/jsf-loja-project/blob/master/src/br/com/triadworks/loja/controller/ProdutoBean.java#L78

Estou com um post em draft sobre o assunto, mas me falta tempo e um pouco de coragem para finaliza-lo

Um abraço.
Basilio wrote:Existe alguma forma sem ser applet?

ActiveX, mas daí não acho uma boa escolha se amarrar ao IEca
Os jars anexados ao Applet também precisam ser assinados!
 
Índice dos Fóruns » Perfil de rponte » Mensagens enviadas por rponte
Ir para:   
Powered by JForum 2.1.8 © JForum Team