Blob may not be manipulated from creating session

1 resposta
rollei

Olá ... pessoal estou precisando mostrar na tela um campo blob que o usuário adicionou, porem ainda nao persistiu. O hibernate tem um problema em gerenciar blobs na mesma session (ate onde eu sei) porque ele cria um dummyBlob que nao tem todos os metos e para fazer o download do blob e enviar para o navegador eu preciso usar justamente um desses metodos

vou colocar um trecho do codigo da adicao do blob apesar de achar que nao precisa estou soh setando na entidade o blob.

for (Iterator iterator = lista.iterator(); iterator.hasNext();) {
				ArquivoAnexo arquivo = (ArquivoAnexo) iterator.next();

				nomeCompleto = a.getTipoDocumento().getNome() + " "
						+ ua.getNome() + " " + this.getCodigoDocumento() + "/"
						+ dataString;

				documento = new DocCorrec();

				documento.setIndicadorPublicacao("N");
				documento.setDataRegistro(new Date());
				documento.setArquivoGravado(arquivo.getArquivo());
				documento.setTarefa(tarefa);
				documento.setArquivo(arquivo.getDocAnexo()); // <<---- EH AQUI QUE ESTOU SETANDO O BLOB FORUM
				documento.setTipoDocumento(arquivo.getTipoDocumento());
				documento.setId(arquivo.getId());
				documento.setExtensao(arquivo.getExtensao());
				documento.setNomeDocumento(arquivo.getNome());
				documento.setAno(Long.parseLong(dataString));
				documento.setNomeCompleto(nomeCompleto);
				documento.setUnidadeAdministrativa(ua);
				documento.setIndicadorRascunho("N");
				documento.setNumeroDocumento(getCodigoDocumento());

				setCodigoDocumento(getCodigoDocumento() + 1);

				listaDocumentos.add(documento);
			}

e aqui o metodo que estou usando para mostrar o arquivo o qual foi dado upload (eh na mesma tela, apos o cara dar o set no documento, ainda nao foi persistido no banco)

public static void detalharDocumento(Blob blobArquivo, String nomeArquivo) {
		try {
			Blob blob = blobArquivo;
			ServletOutputStream sos;
			FacesContext facesContext = FacesContext.getCurrentInstance();
			HttpServletResponse res = (HttpServletResponse) facesContext.getExternalContext().getResponse();
			
			sos = res.getOutputStream();
			sos.write(blob.getBytes(1, (int) blob.length())); // <<---- O ERRO ESTA OCORRENDO AQUI
			
			if (nomeArquivo.toLowerCase().endsWith(".doc")) {
				res.setContentType("application/msword");
			} else if (nomeArquivo.toLowerCase().endsWith(".pdf")) {
				res.setContentType("application/pdf");
			} else if (nomeArquivo.toLowerCase().endsWith(".xls")) {
				res.setContentType("application/vnd.ms-excel");
			} else if (nomeArquivo.toLowerCase().endsWith(".jpeg") || nomeArquivo.toLowerCase().endsWith(".jpg")) {
				res.setContentType("image/jpeg");
			} else {
				res.setContentType("application/octet-stream");
			}
			res.setHeader("Pragma", "public");
			res.setHeader("Cache-control", "must-revalidate");
			res.setHeader ("Content-Disposition", "attachment; filename=\"" + nomeArquivo + "\"");
			
			sos.flush();
			sos.close();
			
			FacesContext.getCurrentInstance().responseComplete();
		} catch (IOException e) {
			WebUtil.error("Ocorreu um erro na entrada/saída de dados");
			e.printStackTrace();
			throw new ApplicationException(e);
		} catch (SQLException e) {
			WebUtil.error("Ocorreu um erro na consulta.");
			e.printStackTrace();
			throw new ApplicationException(e);
		} catch (NullPointerException e) {
			WebUtil.error("Ocorreu um erro na visualização do arquivo.");
			e.printStackTrace();
			throw new ApplicationException(e);
		}
	}
O erro eh esse:
10:25:58,221 FATAL [application] java.lang.UnsupportedOperationException: Blob may not be manipulated from creating session
javax.faces.el.EvaluationException: java.lang.UnsupportedOperationException: Blob may not be manipulated from creating session
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:91)
Caused by: java.lang.UnsupportedOperationException: Blob may not be manipulated from creating session

Como faco para exibir esse arquivo?

[]'s

1 Resposta

rollei

tentei mudar para:

byte[] theBytes = new byte[blobArquivo.getBinaryStream().available()];
			blobArquivo.getBinaryStream().read(theBytes);
			
			ServletOutputStream sos;
			FacesContext facesContext = FacesContext.getCurrentInstance();
			HttpServletResponse res = (HttpServletResponse) facesContext.getExternalContext().getResponse();
			
			sos = res.getOutputStream();
			sos.write(theBytes);

mas da outro erro:

alguem sabe algum contorno?

Criado 14 de abril de 2009
Ultima resposta 14 de abr. de 2009
Respostas 1
Participantes 1