2012-10-25 19 views
1

我有一個多模塊項目,它從數據庫中讀取一個字節數組列,並創建一個碧玉文件發送給電子郵件。從數據庫創建Jasper文件時出錯

從我的web應用程序它完美,而是從我的Java SE應用程序運行的時候,我發現了以下錯誤:

Caused by: java.lang.RuntimeException: net.sf.jasperreports.engine.JRException: Error loading object from file : D:\file.jasper 
    at com.project.RReportJasper.gerarJasperPrint(RReportJasper.java:78) 
    at com.project.RReportJasper.gerarJasperPrint(RReportJasper.java:53) 
    at com.project.RReportJasper.geraRelatorioPDF(RReportJasper.java:29) 
    at com.project.RGenerate.geraRelatorio(RGenerate.java:63) 
    at com.project.AbstractUtil.gerar(AbstractUtil.java:44) 
    at com.project.util.Util.gerar(DameUtil.java:66) 
    at com.project.mail.EnvioEmailAbstractBase.montarAnexo(EnvioEmailAbstractBase.java:514) 
    ... 16 more 

從我的web應用程序讀取時怪異的是,字節從返回數據庫是字節和Java SE應用程序閱讀時,大小爲(雙人)

這裏是我的實體類:

@Entity 
@Table(name= "arquivo") 
public class EArquivo extends TransferObject<Long> { 

    private static final long serialVersionUID = -183345111110383391L; 

    private byte[] arquivo; 
    private String nome; 

    @Override 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "arquivo_id_seq") 
    @SequenceGenerator(name = "arquivo_id_seq", allocationSize = 1, sequenceName = "arquivo_id_seq") 
    @Column(name = "id_arquivo") 
    public Long getId() { 
     return id; 
    } 

    @Column (name = "arquivo") 
    public byte[] getArquivo() { 
     return arquivo; 
    } 

    public void setArquivo(byte[] arquivo) { 
     this.arquivo = arquivo;  
    } 

    @Column(length=80) 
    @Basic(fetch = FetchType.LAZY) 
    public String getNome() { 
     return nome; 
    } 

    public void setNome(String nome) { 
     this.nome = nome; 
    } 

    @Transient 
    public File getFile() throws NotFoundException { 
     File file = null; 
     try { 
      if(arquivo == null){ 
       return null; 
      } 
      byte[] bytes = arquivo; 
      if (bytes.length == 0) { 
       throw new NotFoundException("Not found for: " + getFilial().getCnpj()); 
      } 
      String cnpj = getFilial().getCnpj(); 

      file = Arquivo.createTempFile("file-" + cnpj + "-", ".jasper"); 
      FileOutputStream fos = new FileOutputStream(file); 
      fos.write(bytes); 
      fos.flush(); 
      fos.close(); 
      FileCleaner.track(file, file); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
     return file; 
    } 
} 

有人有什麼想法可能是這個問題?

編輯:加入我如何獲取該文件在我的豆

+1

你不說你如何從數據庫中獲取數據到文件中,但我的猜測是你有一個字符編碼問題 - 事實上文件大小是你從數據庫引出的大小的兩倍我懷疑你是從數據庫中獲取ascii(單字節)字符,並用雙寬度編碼(可能是unicode?)寫出它。 – GreyBeardedGeek

+0

@GreyBeardedGeek我試過了,但問題仍在發生。無論如何,我發現下面的解決方案。謝謝 :) – leonardoborges

回答

1

的問題是Postgres的罐子。

在我的web容器中,版本是9.1,在我的Java SE應用程序中是8.4。 當我更新我的應用程序使用9.1時,問題解決了。