Autor |
Mensagem |
|
Ok, pesquisando uma outra duvida, obtive a resposta
Code:
<t:detalhe name="arquivos" >
<t:property name="id"/>
<t:property name="arquivo" showRemoverButton="false" transientFile="true" />
<t:acao>
<n:link url="/secured/anexoPendencia?id=${pendencia.arquivos[index].id}" type="BUTTON" >download</n:link>
</t:acao>
</t:detalhe>
|
 |
|
Opa
agora preciso fazer o link para o download no jsp
como façoa pra montar um link passando o id do registro que eu quero?
eu fiz no jsp:
Code:
<t:detalhe name="arquivos" >
<t:property name="id"/>
<t:property name="arquivo" showRemoverButton="false" transientFile="true" />
<t:acao>
<n:link url="/secured/anexoPendencia?id=${bean.arquivos.id}" >download</n:link>
</t:acao>
</t:detalhe>
mas o link gerado não imprime o id
|
 |
|
Opa,
pra quem ta acompanhando segue o codigo pra fazer download do anexo que está no banco
Code:
@Controller(path="/secured/anexoPendencia",authorizationModule=CrudAuthorizationModule.class)
public class AnexoPendenciaController extends MultiActionController{
AnexoPendenciaService anexoPendenciaService;
public void setAnexoPendenciaService(AnexoPendenciaService anexoPendenciaService) {
this.anexoPendenciaService = anexoPendenciaService;
}
@DefaultAction
public ModelAndView doDownload(WebRequestContext request,Usuario usuario){
Long id = new Long(request.getParameter("id"));
AnexoPendencia bean = new AnexoPendencia(id);
bean = anexoPendenciaService.load(bean);
Resource resource = new Resource(bean.getTipoconteudo(), bean.getNome(), bean.getConteudo());
resource.setSize(bean.getTamanho().intValue());
return new ResourceModelAndView(resource);
}
}
|
 |
|
Opa,
revisando a implementação acima eu percebi que
se voce alterar os valores da tela principal (pendencia), os anexos eram alterados tambem devido ao save.saveOrUpdateManaged("arquivos");
no PendenciaDAO. Então eu alterei essa parte para:
Code:
@Override
public void updateSaveOrUpdate(final SaveOrUpdateStrategy save) {
save.saveOrUpdateManaged("pendenciasDelegadas");
Pendencia bean = (Pendencia)save.getEntity();
List<AnexoPendencia> arquivos = bean.getArquivos();
for (AnexoPendencia anexo: arquivos) {
if ((anexo.getArquivo() != null) && (anexo.getArquivo().getSize()>0)) {
anexo.setNome(anexo.getArquivo().getName());
anexo.setTipoconteudo(anexo.getArquivo().getContenttype());
anexo.setTamanho(anexo.getArquivo().getSize());
anexo.setConteudo(anexo.getArquivo().getContent());
anexo.setTsmodificacao(anexo.getArquivo().getTsmodification());
anexo.setPendencia(bean);
anexoPendenciaDAO.saveOrUpdate(anexo);
}
}
}
agora ta inserindo e alterando certo.
mas nem tudo são flores....
o remover anexo tambem vou ter que fazer na unha,
e ai que surge o problema.
1- eu poderia criar um controler e colocar um botão remover so pra ir no banco de dados e remover um a um o anexo gravado.
2- eu poderia aproveitar o botão criado no <t:detalhe name="arquivos"> do jsp, mas a maneira de fazer isso é comparnado a lista que ta gravado no banco, com a lista que chega da bean (Pendencia)save.getEntity().getArquivos();
Pedro, Hugo o que acham?
|
 |
|
Valeu Hugo,
voce me deu uma luz então eu fiz assim:
na bean principal eu fiz o relacionamento um-para-muitos normal.
Code:
@OneToMany(cascade={CascadeType.PERSIST, CascadeType.REMOVE}, mappedBy="pendencia")
public List<AnexoPendencia> getArquivos() {
return arquivos;
}
public void setArquivos(List<AnexoPendencia> arquivos) {
this.arquivos = arquivos;
}
no bean filhos ficou assim:
Code:
public class AnexoPendencia implements Serializable {
private static final long serialVersionUID = 1L;
protected Long id;
protected Arquivo arquivo;
protected Pendencia pendencia;
protected String nome;
protected String tipoconteudo;
protected Long tamanho;
protected byte[] conteudo;
protected Timestamp tsmodificacao;
public AnexoPendencia() {
}
public AnexoPendencia(Long id) {
this.id = id;
}
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="gen_anexo_pendencia")
public Long getId() {
return id;
}
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="id_pendencia")
@Required
public Pendencia getPendencia() {
return pendencia;
}
@Transient
public Arquivo getArquivo() {
if (arquivo == null && id != null) {
arquivo = new Arquivo();
arquivo.setCdfile(id);
arquivo.setContent(conteudo);
arquivo.setContenttype(tipoconteudo);
arquivo.setName(nome);
arquivo.setSize(tamanho);
arquivo.setTsmodification(tsmodificacao);
}
return arquivo;
}
public void setArquivo(Arquivo arquivo) {
this.arquivo = arquivo;
}
// demais gettes and settes
no PendenciaDAO sobrescrevi os metodos:
Code:
@Override
public void updateEntradaQuery(QueryBuilder<Pendencia> query) {
query.fetchCollection("pendenciasDelegadas");
query.fetchCollection("arquivos");
}
@Override
public void updateSaveOrUpdate(final SaveOrUpdateStrategy save) {
save.saveOrUpdateManaged("pendenciasDelegadas");
Pendencia bean = (Pendencia)save.getEntity();
List<AnexoPendencia> arquivos = bean.getArquivos();
for (AnexoPendencia anexo: arquivos) {
anexo.setNome(anexo.getArquivo().getName());
anexo.setTipoconteudo(anexo.getArquivo().getContenttype());
anexo.setTamanho(anexo.getArquivo().getSize());
anexo.setConteudo(anexo.getArquivo().getContent());
anexo.setTsmodificacao(anexo.getArquivo().getTsmodification());
}
save.saveOrUpdateManaged("arquivos");
}
e na view pendenciaEntrada.jsp
Code:
...
</t:detalhe>
<t:detalhe name="arquivos">
<t:property name="arquivo"/>
</t:detalhe>
</t:janelaEntrada>
</t:entrada>
ok, ele inseri, altera e apaga gravando no banco blz.
so que agora preciso fazer download, e o arquivo do neo view.DownloadFileServlet so faz download de arquivo fisico.
vou ter que fazer um Servlet pra baixar do banco ou alguem tem algum pronto?
|
 |
|
Blz Pedro,
em relação a lista, tambem dá pra fazer uma query específica e mandar a lista para o itens da property. o que acha?
agora quanto a lista de arquivos se vc puder me mandar eu agradeço
michael (em) maikosoft.com.br
|
 |
|
Salve javaneses!
duas duvidas:
1- Como faço para filtrar a lista(combo) que vem preenchida de de um relacionamento ManyToOne? Explico: Imagine um cadastro de cidades com a opção Capital, e outro cadastro de pessoa no qual vincula-se uma cidade, mas as opções oferecidas do combo cidade so devem constar as capitais.
2- na aplicação de demostração do neo existe um exemplo de upload de arquivo, mas eu posso vincular somento um arquivo a uma pessoa,
como ficaria se eu quisesse vincular mais de um arquivo. ex. um email com vários anexos.
Grato desde já
|
 |
|
Boa tarde Pedro,
obrigado pelas boas vindas, e parabens pelo trabalho do neo framework.
agora quanto a duvida, eu havia pensado em fazer isso, mas o problema
é que a mensagem de erro, caso o usuario esteja bloqueado, é de login e senha. o que não é correto. eu pensei em implementar algo assim:
Code:
User userByLogin = autorizacaoDAO.findUserByLogin(login);
if(userByLogin != null && userByLogin.getPassword().equals(usuario.getPassword())){
if (!userByLogin.isActive()) {
request.addMessage("Usuário bloqueado", MessageType.ERROR);
} else {
request.setUserAttribute("USER", userByLogin);
request.setUserAttribute(MenuTag.MENU_CACHE_MAP, null);
return new ModelAndView("redirect:"+AFTER_LOGIN_GO_TO);
}
} else
request.addMessage("Login e/ou senha inválidos", MessageType.ERROR);
|
 |
|
Salve Javaneses,
estou implementando o exemplo crud fornecido pelo neo framework, e surgiu a seguinte duvida em relação ao campo bloqueado da entidade usuario.
o campo existe no banco de dados mas no processo de autenticação (controler login) ele não interfere.
uma ideia seria colocar o metodo isActive na interface br.com.linkcom.neo.authorization.User
|
 |
|