返回XSSFWorkbook到ResponseEntity报Locale类无序列化器错误如何解决
问题原因
你遇到的报错本质是Jackson序列化框架尝试将XSSFWorkbook对象序列化为JSON时,无法找到类org.apache.xmlbeans.impl.store.Locale的序列化器。XSSFWorkbook内部嵌套了大量POI私有的实现类,这些类没有适配Jackson的序列化规则,哪怕你把它封装到自定义类里,Jackson序列化时仍然会递归处理内部属性,所以无法解决问题。
推荐解决方案
方案1:转为字节数组/Base64字符串返回(最推荐,适合后续二次处理)
这种方式序列化效率高,下游拿到后可以直接还原为XSSFWorkbook对象继续操作,代码修改如下:
首先是将XSSFWorkbook转为字节数组的工具逻辑:
// 将XSSFWorkbook转为字节数组 ByteArrayOutputStream os = new ByteArrayOutputStream(); workbook.write(os); byte[] excelBytes = os.toByteArray(); // 如果需要字符串格式,可以转为Base64 // String base64Excel = Base64.getEncoder().encodeToString(excelBytes);
修改你的控制器方法:
@POST @Path("/excel") public Response getExcel() { try { XSSFWorkbook workbook = this.classname.getExcelObject(); ByteArrayOutputStream os = new ByteArrayOutputStream(); workbook.write(os); // 直接返回字节数组,也可以封装为自定义对象返回 return Response.status(Response.Status.OK).entity(os.toByteArray()).build(); } catch (Exception e) { return ExceptionHandler.error(Response.Status.INTERNAL_SERVER_ERROR, e.getMessage()); } }
下游拿到字节数组后可以直接还原为XSSFWorkbook:
ByteArrayInputStream is = new ByteArrayInputStream(excelBytes); XSSFWorkbook workbook = new XSSFWorkbook(is);
方案2:配置Jackson绕过空Bean序列化报错(不推荐)
如果必须直接返回XSSFWorkbook对象,你可以在Jackson的配置中关闭FAIL_ON_EMPTY_BEANS特性,仅绕过报错。但这种方式序列化出来的JSON会丢失大量核心属性,几乎无法反序列化还原为可用的XSSFWorkbook对象,仅适合调试场景。
Jersey中配置示例:
@Provider public class JacksonConfig implements ContextResolver<ObjectMapper> { private final ObjectMapper objectMapper; public JacksonConfig() { objectMapper = new ObjectMapper(); objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false); } @Override public ObjectMapper getContext(Class<?> type) { return objectMapper; } }
内容的提问来源于stack exchange,提问作者Doofenshmirtz
相关产品推荐
相关产品推荐

