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
相关产品推荐
相关产品推荐

