You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nexus搜索Artifact时JAXB映射XML数据为空问题求助

解决Nexus XML响应JAXB解析后data为空的问题

问题根源

你的代码中JAXB上下文未包含NexusNGArtifact类,导致JAXB无法识别<data>节点下的<artifact>元素,进而无法完成映射,最终srsp.getData()返回空。同时Java 17环境下的JAXB依赖配置也需要适配版本要求。

解决方案

1. 修正JAXBContext初始化

创建JAXBContext时必须显式加入NexusNGArtifact类,JAXB需要知晓所有参与XML映射的实体类型才能正确解析子元素:

JAXBContext context = JAXBContext.newInstance(SearchResponse.class, SearchNGResponse.class, NexusNGArtifact.class);

2. 调整Java 17下的JAXB依赖与编译配置

Java 17已移除内置JAXB模块,需确保依赖完整且编译时添加必要参数:

  • 更新POM的编译配置,添加模块参数:
<properties>
    <maven.compiler.version>17</maven.compiler.version>
    <maven.compiler.target>17</maven.compiler.target>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.args>--add-modules java.xml.bind</maven.compiler.args>
</properties>
  • 统一JAXB依赖版本,避免版本冲突:将jaxb-impl、jaxb-api、jaxb-runtime统一为2.3.8版本。

3. 验证实体类与XML元素的映射一致性

检查NexusNGArtifact类的JAXB注解,确认其标注的元素名称与XML中的<artifact>一致。该类来自nexus-indexer-lucene-model依赖,默认注解已匹配<artifact>元素,无需手动修改。

修正后的完整代码

import java.net.URL;
import java.net.URLConnection;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;

import org.sonatype.nexus.rest.model.NexusNGArtifact;
import org.sonatype.nexus.rest.model.SearchNGResponse;
import org.sonatype.nexus.rest.model.SearchResponse;

public class TestNexus {

    public static void main(String[] args) throws Exception {
        // 添加NexusNGArtifact到JAXB上下文
        JAXBContext context = JAXBContext.newInstance(SearchResponse.class, SearchNGResponse.class, NexusNGArtifact.class);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        URLConnection connection = new URL("https://oss.sonatype.org/service/local/lucene/search?sha1=4a7b16bae95be72f7d591a517bd03e1172ede7ee").openConnection();
        connection.setConnectTimeout(5000);
        connection.setReadTimeout(10000);
        Object resp = unmarshaller.unmarshal(connection.getInputStream());
        if (resp instanceof SearchNGResponse) {
            SearchNGResponse srsp = (SearchNGResponse) resp;
            for (NexusNGArtifact ar : srsp.getData()) {
                System.out.println("group:" + ar.getGroupId());
                System.out.println("artifact:" + ar.getArtifactId());
                System.out.println("version:" + ar.getVersion());
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Nicolas Baumann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 13:37:02