我尝试将BIRT报告与我的webApp集成。 当我在Eclips中打开报告时 - 所有可用信息和渲染正常。 万一,当我尝试从webApp下载此报告时: 在PDF中 - 仅渲染静态文本。 在HTML中 - 我看到了exeption:
Chart (id = 32):
- Duplicate aggregation name: COUNT. (Element ID:32)
Duplicate aggregation name: COUNT. ( 1 time(s) )
detail : org.eclipse.birt.report.engine.api.EngineException: Duplicate aggregation name: COUNT. (Element ID:32)
at org.eclipse.birt.report.engine.executor.ExecutionContext.addException(ExecutionContext.java:1237)
at org.eclipse.birt.report.engine.data.dte.ReportQueryBuilder$QueryBuilderVisitor.visitExtendedItem(ReportQueryBuilder.java:693)
at org.eclipse.birt.report.engine.ir.ExtendedItemDesign.accept(ExtendedItemDesign.java:45)
at org.eclipse.birt.report.engine.data.dte.ReportQueryBuilder.build(ReportQueryBuilder.java:256)
at org.eclipse.birt.report.engine.data.dte.ReportQueryBuilder.build(ReportQueryBuilder.java:237)
at org.eclipse.birt.report.engine.data.dte.AbstractDataEngine.prepare(AbstractDataEngine.java:180)
myServlet:
@WebServlet(name = "GenerateTestBirtServlet", urlPatterns = {"/GenerateTestBirtServlet"})
public class GenerateTestBirtServlet extends HttpServlet {
private IReportEngine birtEngine;
private TestBirtService report;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
{
String downloadFileName = "MyReport";
try{
EngineConfig config = new EngineConfig();
Platform.startup(config);
String reportName = request.getParameter("path");
ServletContext sc = request.getSession().getServletContext();
birtEngine = BirtEngine.getBirtEngine(sc);
IReportEngineFactory factory = (IReportEngineFactory) Platform.createFactoryObject( IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY );
IReportEngine engine = factory.createReportEngine( config );
IReportRunnable reportDoc = engine.openReportDesign(reportName);
HTMLRenderOption option = new HTMLRenderOption();
option.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_HTML);
response.setHeader( "Content-Disposition", "attachment; filename="+downloadFileName );
option.setOutputStream(response.getOutputStream());
IRunAndRenderTask task = engine.createRunAndRenderTask(reportDoc);
task.setRenderOption(option);
task.validateParameters();
task.run();
task.close();
engine.destroy();
}catch( Exception ex){
ex.printStackTrace();
}
finally
{
Platform.shutdown( );
RegistryProviderFactory.releaseDefault();
}
}
}
}
pom:
<dependency>
<groupId>org.eclipse.birt.runtime</groupId>
<artifactId>org.eclipse.birt.runtime</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.birt.runtime</groupId>
<artifactId>viewservlets</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.ow2.orchestra.eclipse.birt</groupId>
<artifactId>org.ow2.orchestra.eclipse.birt.report.engine</artifactId>
<version>3.7.0</version>
</dependency>
BirtEngine:
public class BirtEngine {
private static IReportEngine birtEngine = null;
private static Properties configProps = new Properties();
private final static String configFile = "BirtConfig.properties";
public static synchronized void initBirtConfig() {
loadEngineProps();
}
public static synchronized IReportEngine getBirtEngine(ServletContext sc) {
if (birtEngine == null)
{
EngineConfig config = new EngineConfig();
if( configProps != null){
String logLevel = configProps.getProperty("logLevel");
Level level = Level.OFF;
if ("SEVERE".equalsIgnoreCase(logLevel))
{
level = Level.SEVERE;
} else if ("WARNING".equalsIgnoreCase(logLevel))
{
level = Level.WARNING;
} else if ("INFO".equalsIgnoreCase(logLevel))
{
level = Level.INFO;
} else if ("CONFIG".equalsIgnoreCase(logLevel))
{
level = Level.CONFIG;
} else if ("FINE".equalsIgnoreCase(logLevel))
{
level = Level.FINE;
} else if ("FINER".equalsIgnoreCase(logLevel))
{
level = Level.FINER;
} else if ("FINEST".equalsIgnoreCase(logLevel))
{
level = Level.FINEST;
} else if ("OFF".equalsIgnoreCase(logLevel))
{
level = Level.OFF;
}
config.setLogConfig(configProps.getProperty("logDirectory"), level);
}
config.setEngineHome("");
config.getAppContext().put(EngineConstants.APPCONTEXT_CLASSLOADER_KEY, BirtEngine.class.getClassLoader());
IPlatformContext context = new PlatformServletContext( sc );
config.setPlatformContext( context );
//Create the report engine
//birtEngine = new ReportEngine( config );
//ReportEngine engine = new ReportEngine( null );
try
{
Platform.startup( config );
}
catch ( BirtException e )
{
e.printStackTrace( );
}
IReportEngineFactory factory = (IReportEngineFactory) Platform
.createFactoryObject( IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY );
birtEngine = factory.createReportEngine( config );
}
return birtEngine;
}
public static synchronized void destroyBirtEngine() {
if (birtEngine == null) {
return;
}
birtEngine.destroy();
Platform.shutdown();
birtEngine = null;
}
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
private static void loadEngineProps() {
try {
//Config File must be in classpath
ClassLoader cl = Thread.currentThread ().getContextClassLoader();
InputStream in = null;
in = cl.getResourceAsStream (configFile);
configProps.load(in);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
如何解决此问题?
答案 0 :(得分:0)
根据您提供的例外情况:
Duplicate aggregation name: COUNT
这意味着在您的报告文件中,您多次使用名为aggregation
的 COUNT
,将其他聚合重命名为其他内容,例如COUNT_2
...