XSLT格式非法时Transformer未抛异常,如何实现预期抛出逻辑?
XSLT格式不合法时
newTransformer未抛出异常的解决方法 我通过XSL-FO将XML文件转换为PDF,流程依赖基于XSLT文件的Transformer。获取Transformer的代码如下:
private void prepareTransformer(final TransformerFactory tFactory) throws TransformerConfigurationException { xmlTransformer = tFactory.newTransformer( new StreamSource(getClass().getResourceAsStream(xsltPath))); }
当前存在的问题是,当XSLT格式不合法时,上述代码仅在控制台打印异常日志却不抛出异常,控制台输出如下:
System-ID unbekannt; Zeilennummer328; Spaltennummer69; xsl:when ist an dieser Position in der Formatvorlage nicht zulässig! System-ID unbekannt; Zeilennummer63; Spaltennummer54; org.xml.sax.SAXException: javax.xml.transform.TransformerException: ElemTemplateElement-Fehler: testcaseDetails javax.xml.transform.TransformerException: ElemTemplateElement-Fehler: testcaseDetails (Position des Fehlers unbekannt)org.apache.fop.fo.ValidationException: Dem Element "fo:simple-page-master" fehlt ein verlangtes Property "master-name"! (Keine Kontextinformationen verfügbar)
由于库未抛出异常,我无法便捷处理该情况。我期望newTransformer(Source source)方法能够抛出异常,请问是否有实现该预期的方法?
附完整类代码:
@Log public class Report { private final String xsltPath; private FopFactory fopFactory; private Transformer xmlTransformer; private Report(final String xsltPath) { this.xsltPath = xsltPath; try { prepareTransformer(createFobTransformer()); } catch (final SAXException | IOException | ConfigurationException | TransformerConfigurationException ex) { log.log(Level.SEVERE, null, ex); throw new PdfReportException(ex); } } public static Report getInstance() { return new Report("/report/report-regd.xslt"); } private void prepareTransformer(final TransformerFactory tFactory) throws TransformerConfigurationException { xmlTransformer = tFactory.newTransformer( new StreamSource(getClass().getResourceAsStream(xsltPath))); } private TransformerFactory createFobTransformer() throws SAXException, IOException, ConfigurationException { final InputStream inFop = getClass().getResourceAsStream("/report/fop.xconf"); final var fopBuilder = new FopFactoryBuilder(new File(".").toURI(), new ClasspathResolverURIAdapter()); final var cfgBuilder = new DefaultConfigurationBuilder(); final Configuration cfg = cfgBuilder.build(inFop); fopBuilder.setConfiguration(cfg); fopFactory = fopBuilder.build(); final TransformerFactory tFactory = TransformerFactory.newInstance(); tFactory.setURIResolver(new ClasspathURIResolver()); return tFactory; } public byte[] generatePDFReport(final String xml) { final var out = new ByteArrayOutputStream(); final var agent = fopFactory.newFOUserAgent(); try { final var fop = agent.newFop(MimeConstants.MIME_PDF, out); final var result = new SAXResult(fop.getDefaultHandler()); final var src = new StreamSource(new StringReader(xml)); xmlTransformer.transform(src, result); } catch (final FOPException | TransformerException e) { throw new PdfReportException(e); } return out.toByteArray(); } public static class PdfReportException extends RuntimeException { private static final long serialVersionUID = 6009368304491510184L; public PdfReportException(final Throwable cause) { super(cause); } } }
另外,Report构造函数中未捕获到任何异常。
内容的提问来源于stack exchange,提问作者Julien Berthoud
相关产品推荐
相关产品推荐

