Java 从数据库创建Jasper文件时出错
我有一个多模块项目,它从数据库中读取一个字节数组列,并创建一个jasper文件将其发送到电子邮件 从我的web应用程序来看,它工作得很好,但从我的Java SE应用程序运行时,我遇到以下错误:Java 从数据库创建Jasper文件时出错,java,jasper-reports,Java,Jasper Reports,我有一个多模块项目,它从数据库中读取一个字节数组列,并创建一个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.RRepor
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应用程序读取时,从数据库返回的字节数是120323字节,而当Java SE应用程序读取时,大小是240645(两倍大小)
这是我的实体类:
@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;
}
}
@实体
@表(name=“arquivo”)
公共类EArquivo扩展了TransferObject{
私有静态最终长serialVersionUID=-183345111110383391L;
专用字节[]arquivo;
私有字符串名称;
@凌驾
@身份证
@GeneratedValue(策略=GenerationType.AUTO,generator=“arquivo\u id\u seq”)
@SequenceGenerator(name=“arquivo\u id\u seq”,allocationSize=1,sequenceName=“arquivo\u id\u seq”)
@列(name=“id\u arquivo”)
公共长getId(){
返回id;
}
@列(name=“arquivo”)
公共字节[]getArquivo(){
返回阿尔基沃;
}
公共无效setArquivo(字节[]arquivo){
this.arquivo=arquivo;
}
@柱(长度=80)
@基本(fetch=FetchType.LAZY)
公共字符串getNome(){
返回nome;
}
公共无效集合名称(字符串名称){
this.nome=nome;
}
@短暂的
公共文件getFile()引发NotFoundException{
File=null;
试一试{
if(arquivo==null){
返回null;
}
字节[]字节=arquivo;
if(bytes.length==0){
抛出新的NotFoundException(“找不到:+GetDurth().getCnpj());
}
字符串cnpj=getsubstand().getCnpj();
file=Arquivo.createTempFile(“file-”+cnpj+“-”,“.jasper”);
FileOutputStream fos=新的FileOutputStream(文件);
fos.写入(字节);
fos.flush();
fos.close();
跟踪(文件,文件);
}捕获(IOE异常){
抛出新的运行时异常(e);
}
返回文件;
}
}
有人知道这是什么问题吗
编辑:添加如何在我的bean中获取文件问题在于Postgres jar 在我的web容器中,版本是9.1,在我的JavaSE应用程序中是8.4。
当我将应用程序更新为使用9.1时,问题就解决了。问题是Postgres jar 在我的web容器中,版本是9.1,在我的JavaSE应用程序中是8.4。
当我将我的应用程序更新为使用9.1时,问题就解决了。您没有说如何将数据从数据库中获取到文件,但我猜您有一个字符编码问题-文件大小是从数据库获取的大小的两倍,这一事实让我怀疑您获取的是ascii(单字节)从数据库中提取字符,并使用双宽度编码(可能是unicode?)将其写出。@GreybeardGeek我尝试过,但问题仍然存在。不管怎样,我找到了下面发布的解决方案。谢谢:)您没有说如何从数据库获取数据到文件,但我猜您有一个字符编码问题-文件大小是从数据库获取的大小的两倍这一事实让我怀疑您从数据库获取的是ascii(单字节)字符,并且正在用双宽度编码(也许是unicode?)写出来。@GreybearedGeek我试过了,但问题仍然存在。不管怎样,我找到了下面发布的解决方案。谢谢:)