JAXB: how to marshall map into <key>value</key>

本文介绍了一种使用JAXB将HashMap&lt;String, Integer&gt;序列化为XML的方法,并提供了具体的实现代码,包括自定义适配器和根元素类。

MapElements :

package com.cellfish.mediadb.rest.lucene;

import javax.xml.bind.annotation.XmlElement;

class MapElements
{
  @XmlElement public String  key;
  @XmlElement public Integer value;

  private MapElements() {} //Required by JAXB

  public MapElements(String key, Integer value)
  {
    this.key   = key;
    this.value = value;
  }
}

MapAdapter :

import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.annotation.adapters.XmlAdapter;

class MapAdapter extends XmlAdapter<MapElements[], Map<String, Integer>> {
    public MapElements[] marshal(Map<String, Integer> arg0) throws Exception {
        MapElements[] mapElements = new MapElements[arg0.size()];
        int i = 0;
        for (Map.Entry<String, Integer> entry : arg0.entrySet())
            mapElements[i++] = new MapElements(entry.getKey(), entry.getValue());

        return mapElements;
    }

    public Map<String, Integer> unmarshal(MapElements[] arg0) throws Exception {
        Map<String, Integer> r = new HashMap<String, Integer>();
        for (MapElements mapelement : arg0)
            r.put(mapelement.key, mapelement.value);
        return r;
    }
}

The rootElement :

import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
public class Root {

    private Map<String, Integer> mapProperty;

    public Root() {
        mapProperty = new HashMap<String, Integer>();
    }

    @XmlJavaTypeAdapter(MapAdapter.class)
    public Map<String, Integer> getMapProperty() {
        return mapProperty;
    }

    public void setMapProperty(Map<String, Integer> map) {
        this.mapProperty = map;
    }

}

I found the code in this website : http://www.developpez.net/forums/d972324/java/general-java/xml/hashmap-jaxb/

<think>我们正在处理一个Maven项目中的依赖问题。用户报告在添加了三个依赖(jaxb-api,activation,jaxb-runtime)后,Maven依赖树中缺少了Dependencies项。根据引用[1]中的错误信息:`java.lang.NoClassDefFoundError:Unabletoloadclassgroovy.xml.jaxb.JaxbGroovyMethodsduetomissingdependencyjavax/xml/bind/JAXBContext`,这通常是因为缺少JAXBAPI的依赖。JAXB(JavaArchitectureforXMLBinding)在Java11中被移除,因此需要手动添加依赖。用户添加了以下依赖:-jaxb-api-activation-jaxb-runtime但是添加后,Maven树中缺少Dependencies项。这可能是因为依赖冲突或者依赖管理的问题。根据引用[2]中提到的Maven依赖管理机制(依赖传递、排除、版本仲裁、jar包冲突解决),我们可以尝试以下步骤:1.检查依赖的传递性:确保添加的依赖没有因为版本冲突而被排除。2.使用MavenHelper插件(引用[2]中提到)来查看依赖冲突。3.使用dependencyManagement统一管理版本(引用[2]中最后提到)。另外,考虑到用户的问题描述,可能是在IDE(如IntelliJIDEA)中查看Maven项目时,依赖树没有正确显示。我们可以尝试重新导入Maven项目,或者清除缓存并重新构建。具体步骤:步骤1:检查pom.xml中是否正确添加了依赖。例如:```xml<dependencies><!--JAXBAPI--><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version></dependency><!--JAXBRuntime--><dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.1</version></dependency><!--Activation--><dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version></dependency></dependencies>```注意:版本号需要兼容,这里使用2.3.1版本作为示例。步骤2:如果依赖树中仍然没有显示,尝试执行以下命令:-`mvncleaninstall-U`强制更新依赖-在IDE中,右键点击项目->Maven->Reimport步骤3:如果存在依赖冲突,使用MavenHelper插件(在IDEA中安装)查看冲突。在pom.xml文件下方有“DependencyAnalyzer”选项卡,可以查看冲突并排除不需要的依赖。步骤4:如果项目是多模块项目,确保在父项目中使用了`<dependencyManagement>`来管理依赖版本,以避免版本冲突(引用[2]中的4.3节)。例如:```xml<dependencyManagement><dependencies><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version></dependency><dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.1</version></dependency><dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version></dependency></dependencies></dependencyManagement>```步骤5:如果问题仍然存在,检查是否有其他依赖排除了这些依赖。在Maven中,可以使用`mvndependency:tree`命令查看依赖树,检查是否有依赖被排除。例如:运行`mvndependency:tree-Dverbose`可以详细显示依赖树,并显示被忽略的依赖(因为冲突或排除)。步骤6:如果发现冲突,可以在具体的依赖中排除冲突的依赖。例如:```xml<dependency><groupId>some.group</groupId><artifactId>some-artifact</artifactId><version>1.0</version><exclusions><exclusion><groupId>冲突的groupId</groupId><artifactId>冲突的artifactId</artifactId></exclusion></exclusions></dependency>```总结:通常,Maven依赖树中缺少依赖项是由于依赖冲突或者版本仲裁导致依赖被排除。通过以上步骤,应该能够定位问题并解决。另外,引用[3]和[4]是关于SpringBoot和RabbitMQ的,与当前问题无关,可以忽略。如果以上步骤无法解决问题,可能需要检查Maven的settings.xml配置文件,确保没有全局的依赖排除或者镜像问题导致依赖下载失败。最后,建议用户检查IDE的Maven配置是否正确指向了正确的Maven安装和settings.xml文件。</think>### Maven依赖树缺少Dependencies项的解决方案 当在Maven项目中添加`jaxb-api`、`activation`和`jaxb-runtime`依赖后出现依赖树中缺少Dependencies项的问题,通常是由依赖冲突或版本仲裁引起的。以下是系统的解决步骤: #### 1. **验证依赖声明** 首先检查`pom.xml`中的依赖声明是否正确(建议使用兼容版本组合): ```xml <dependencies> <!-- JAXB API --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> <!-- 兼容Java 11+ --> </dependency> <!-- JAXB 运行时 --> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.1</version> </dependency> <!-- Java Activation --> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> </dependencies> ``` #### 2. **分析依赖树** 在终端执行以下命令检查依赖关系: ```bash mvn dependency:tree -Dverbose ``` 重点关注输出中的: ``` [INFO] | \- javax.xml.bind:jaxb-api:jar:2.3.1:compile [INFO] | \- org.glassfish.jaxb:jaxb-runtime:jar:2.3.1:compile [INFO] | \- (排除的依赖项列表) ``` `-Dverbose`参数会显示被排除的依赖(标记为`omitted for conflict`)[^2]。 #### 3. **解决依赖冲突 ##### 方法1:使用`<exclusions>`排除冲突 ```xml <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.1</version> <exclusions> <exclusion> <groupId>javax.activation</groupId> <!-- 排除冲突的activation --> <artifactId>activation</artifactId> </exclusion> </exclusions> </dependency> ``` ##### 方法2:统一版本仲裁 在`<dependencyManagement>`中强制指定版本: ```xml <dependencyManagement> <dependencies> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> <!-- 强制统一版本 --> </dependency> </dependencies> </dependencyManagement> ``` #### 4. **检查JDK兼容性 确认JDK版本: - Java 8:内置JAXB - Java 9+:需显式添加依赖(如示例版本) 若使用Java 11+,需确保依赖包含`jakarta.xml.bind`命名空间(如`jakarta.xml.bind:jakarta.xml.bind-api:3.0.1`)[^1]。 #### 5. **IDE辅助工具 在IntelliJ IDEA中: 1. 安装 **Maven Helper** 插件 2. 打开`pom.xml` → 选择 **Dependency Analyzer** 选项卡 3. 检查红色冲突项并右键排除冲突依赖 #### 6. **清理Maven缓存 删除本地仓库中的相关依赖: ```bash rm -rf ~/.m2/repository/javax/xml/bind/ rm -rf ~/.m2/repository/javax/activation/ ``` 然后执行: ```bash mvn clean install -U ``` #### 7. **验证运行时配置 在Spring Boot项目中,确保`@SpringBootApplication`主类能正确初始化[^3]: ```java @SpringBootApplication public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } } ``` > **根本原因**:该问题通常由Maven的依赖仲裁机制引起。当多个依赖传递引入相同JAR的不同版本时,Maven会自动选择最高版本(版本仲裁),导致低版本依赖从树中被移除[^2]。使用`-Dverbose`参数可看到`omitted for conflict with version X.X.X`的提示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值