报错:java.util.Map is an interface, and JAXB can't handle interfaces.

本文介绍了在WebService开发过程中遇到的使用Map接口作为参数或返回值导致的问题,并提供了解决方案,即将Map替换为具体的实现类HashMap。

报错:java.util.Map is an interface, and JAXB can't handle interfaces.

  339人阅读  评论(0)  收藏  举报
  分类:
<code class="hljs applescript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">严重: Context [/cgf_service] startup failed due <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">to</span> previous errors
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">at</span> org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">330</span>)
    ... <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">68</span> more
Caused <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">by</span>: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> counts <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">of</span> IllegalAnnotationExceptions
java.util.Map <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">is</span> an interface, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">and</span> JAXB can't handle interfaces.
    this problem <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">is</span> related <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">to</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">the</span> following location:
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">at</span> java.util.Map
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">at</span> private java.util.Map org.sklse.management.service.jaxws_asm.InvokeServiceMethod2.transportData
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">at</span> org.sklse.management.service.jaxws_asm.InvokeServiceMethod2
java.util.Map <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">does</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">not</span> have a no-arg default constructor.
    this problem <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">is</span> related <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">to</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">the</span> following location:
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">at</span> java.util.Map
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">at</span> private java.util.Map org.sklse.management.service.jaxws_asm.InvokeServiceMethod2.transportData
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">at</span> org.sklse.management.service.jaxws_asm.InvokeServiceMethod2</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

解决方法:将服务端的services接口返回的Map类型的值改为HashMap. 
因为在做webService复杂类型值传递时,返回值的类型不要用接口类型。例如List应该改为ArrayList,Map改为HashMap等

你遇到的错误: ``` Can not instance class: java.util.Map ``` 是由于你使用了如下代码: ```java EasyExcel.read(is, Map.class, listener).sheet().doRead(); ``` 而 **EasyExcel 不支持直接使用 `Map.class` 作为数据模型类**,因为 `Map` 是一个接口无法被实例化。你需要使用 EasyExcel 提供的 `Map` 读取方式,但需要配合正确的读取策略。 --- ## ✅ 正确解决方案:使用 `read(ReadListener)` + `AnalysisEventListener<Map<Integer, String>>` EasyExcel 提供了专门用于读取动态列的方式,使用 `EasyExcelFactory.read(ReadListener)` 方法,而不是传入 `Map.class`。 --- ## ✅ 修改后的导入方法(解决报错) ### ✅ 1. 修改 `importDynamicExcel` 方法 ```java public static ExcelResult<Map<String, String>> importDynamicExcel(InputStream is) { DynamicExcelListener listener = new DynamicExcelListener(); EasyExcel.read(is).registerReadListener(listener).sheet().doRead(); return new ExcelResult<>(listener.getDataList(), listener.getFixedColumns(), listener.getYearColumns()); } ``` > ⚠️ 注意:这里没有传入 `Map.class`,而是直接调用 `EasyExcel.read(is)`,然后注册监听器。 --- ### ✅ 2. 确保 `DynamicExcelListener` 是如下形式(完整代码) ```java public class DynamicExcelListener extends AnalysisEventListener<Map<Integer, String>> { private List<Map<String, String>> dataList = new ArrayList<>(); private Map<Integer, String> headerMap = new HashMap<>(); private Set<String> yearColumns = new HashSet<>(); private static final Set<String> FIXED_COLUMNS = new HashSet<>(Arrays.asList( "预算类别", "预算内容", "预算金额", "资金来源" )); @Override public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { this.headerMap.putAll(headMap); for (Map.Entry<Integer, String> entry : headMap.entrySet()) { String colName = entry.getValue(); if (isYearColumn(colName)) { yearColumns.add(colName); } } } @Override public void invoke(Map<Integer, String> dataMap, AnalysisContext context) { Map<String, String> row = new HashMap<>(); for (Map.Entry<Integer, String> entry : dataMap.entrySet()) { Integer colIndex = entry.getKey(); String colName = headerMap.getOrDefault(colIndex, "未知列"); String value = entry.getValue(); row.put(colName, value); } dataList.add(row); } @Override public void doAfterAllAnalysed(AnalysisContext context) { System.out.println("数据解析完成"); } public List<Map<String, String>> getDataList() { return dataList; } public Set<String> getYearColumns() { return yearColumns; } public Set<String> getFixedColumns() { return FIXED_COLUMNS; } private boolean isYearColumn(String colName) { return colName != null && colName.matches("\\d{4}"); } } ``` --- ### ✅ 3. ExcelResult 类保持不变 ```java public class ExcelResult<T> { private List<T> dataList; private Set<String> fixedColumns; private Set<String> dynamicColumns; public ExcelResult(List<T> dataList, Set<String> fixedColumns, Set<String> dynamicColumns) { this.dataList = dataList; this.fixedColumns = fixedColumns; this.dynamicColumns = dynamicColumns; } public List<T> getDataList() { return dataList; } public Set<String> getFixedColumns() { return fixedColumns; } public Set<String> getDynamicColumns() { return dynamicColumns; } } ``` --- ## ✅ 总结对比 | 方式 | 是否支持 | 原因 | |------|----------|------| | `EasyExcel.read(is, Map.class, listener)` | ❌ 报错 | `Map` 是接口,不能实例化 | | `EasyExcel.read(is).registerReadListener(listener)` | ✅ 正确 | 使用监听器读取 Map 类型数据 | --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值