在基于非模块化Servlet的web应用中使用封装模块



我有一个基于servlet的现有Java web应用程序。它是一个Eclipse项目,在Tomcat 10中运行。

到目前为止,该应用程序没有使用任何Java 9+模块化/JPMS。代码库从JDK 8开始,但现在使用JDK 17并且可以工作。

现在我有一个添加XLSX文件导出的特性请求。我想使用Apache POI的XSSF。

但是POI是一个相当大的库,有许多封闭的jar,我有点担心"污染"。我的类路径。

关于"深度防御",我不希望我的应用程序的internet表面部分能够直接访问POI的任何类或其依赖项。例如,避免在gadget chain中使用此类。

我的XLSX导出特性的API基本上是这样的:
public class MyCustomDataTransferObject {
// ... some attributes with getters and setters
}
public class MyXLSXExportException extends Exception {
// ...
}
public interface MyXLSXExport {
byte[] createXLSXOutputFromData( MyCustomDataTransferObject bean )
throws MyXLSXExportException;
}
// That's all.

我的主应用程序不应该访问其他任何内容!根本没有一个XSSF类。

我的第一个想法是:为XLSX导出编写一个微服务,并在我的主应用程序中使用HTTP(S)内部访问它(通过环回接口)。

但是我又想:这不是Java 9模块系统的一个很好的用例吗?

如果我在正确的轨道上:如何使我的非模块化主项目使用XLSX导出模块?我猜XLSX导出模块应该放在工作空间中的一个新的专用Eclipse项目中。XLSX导出模块项目获得一个module-info,并且在主项目的项目属性中,我必须将XLSX Eclipse项目添加为模块路径依赖项。对吗?主项目本身是否需要module-info?在Tomcat中部署这个设置需要考虑什么?你以前做过吗?有反对意见或其他想法吗?

在你在已经很复杂的东西(POI,更不用说你的应用程序的其余部分)上添加大量复杂性之前,考虑一下根本不要使用POI。

如果你所做的只是在单个XLSX工作表中提供数据源,那么你不需要处理POI。

我有几个(内部的)项目使用POI来导出XLSX数据,我正在做另一个项目,我很想避免使用POI(出于同样的原因,你想封装它,加上我想在数据输入时流输出)。我遇到了这个问题:如何创建和编写Excel文件(.xlsx)?并受到给出的答案的启发,制作了这个:https://github.com/Yaytay/streaming-xlsx-writer

它所做的只是在数据传入时将带有单个表的XLSX文件流式传输到OutputStream。有一些基本的格式可用(如果您需要更多,请随时询问)。内存开销几乎为零,并且没有依赖关系。

这是很新的,所以我还没有测试过,但如果你发现有什么问题,我会修复它,因为我需要它为我的项目工作:)。

最新更新