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