尝试调用Rest API并尝试使用Spring Boot读取响应XML

问题描述

我尝试使用REST API(沙盒名称便宜),但出现错误。我在下面分享了我的项目详细信息。

邮递员请求

https://api.sandBox.namecheap.com/xml.response/?apiuser=faizshirajiapi&ApiKey=914443384d8645039fd038c9074c6f3&UserName=faizshirajiapi&ClientIp=103.135.254.237&Command=namecheap.domains.check&DomainList=faizdoller.com

和我的回复xml

<?xml version="1.0" encoding="utf-8"?>
<ApiResponse Status="OK" xmlns="http://api.namecheap.com/xml.response">
    <Errors />
    <Warnings />
    <RequestedCommand>namecheap.domains.check</RequestedCommand>
    <CommandResponse Type="namecheap.domains.check">
        <DomainCheckResult Domain="faizdoller.com" Available="true" ErrorNo="0" Description="" IsPremiumName="false" PremiumRegistrationPrice="0" PremiumrenewalPrice="0" PremiumRestorePrice="0" PremiumTransferPrice="0" IcannFee="0" EapFee="0.0" />
    </CommandResponse>
    <Server>PHX01SBAPIEXT02</Server>
    <GMTTimeDifference>--5:00</GMTTimeDifference>
    <ExecutionTime>0.402</ExecutionTime>
</ApiResponse>

我的项目文件详细信息如下:

package com.namecheap.apiclient.model;

import javax.xml.bind.annotation.XmlRootElement;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@XmlRootElement
@JsonIgnoreProperties(ignoreUnkNown = true)
public class ApiResponse {
    String status;
    String requestedCommand;
    private CommandResponse commandResponse;
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    public String getRequestedCommand() {
        return requestedCommand;
    }
    public void setRequestedCommand(String requestedCommand) {
        this.requestedCommand = requestedCommand;
    }
    public CommandResponse getCommandResponse() {
        return commandResponse;
    }
    public void setCommandResponse(CommandResponse commandResponse) {
        this.commandResponse = commandResponse;
    }
    
}

package com.namecheap.apiclient.client;

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import com.namecheap.apiclient.model.ApiResponse;

@Component
public class CallRestService implements CommandLineRunner {
    private static void callRestService() {
        RestTemplate restTemplate = new RestTemplate();
        ApiResponse apiResponse = restTemplate.getForObject("https://api.sandBox.namecheap.com/xml.response/?apiuser=faizshirajiapi&ApiKey=914443384d8645039fd038c9074c6f3c&UserName=faizshirajiapi&ClientIp=103.135.254.237&Command=namecheap.domains.check&DomainList=faizdoller.com",ApiResponse.class);
        System.out.println("API Response Status :" + apiResponse.getRequestedCommand());
    }

    @Override
    public void run(String... args) throws Exception {
        callRestService();
        
    }
}

运行应用程序后出现错误提示

java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:798) ~[spring-boot-2.3.5.RELEASE.jar:2.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:779) ~[spring-boot-2.3.5.RELEASE.jar:2.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:322) ~[spring-boot-2.3.5.RELEASE.jar:2.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) ~[spring-boot-2.3.5.RELEASE.jar:2.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.3.5.RELEASE.jar:2.3.5.RELEASE]
    at com.namecheap.apiclient.SandBoxNameCheapTry2Application.main(SandBoxNameCheapTry2Application.java:12) ~[classes/:na]
Caused by: org.springframework.http.converter.HttpMessageConversionException: Could not create JAXBContext for class [class com.namecheap.apiclient.model.ApiResponse]: null; nested exception is javax.xml.bind.JAXBException
 - with linked exception:
[java.lang.classNotFoundException: com.sun.xml.bind.v2.ContextFactory]
    at org.springframework.http.converter.xml.AbstractJaxb2HttpMessageConverter.lambda$getJaxbContext$0(AbstractJaxb2HttpMessageConverter.java:114) ~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705) ~[na:na]
    at org.springframework.http.converter.xml.AbstractJaxb2HttpMessageConverter.getJaxbContext(AbstractJaxb2HttpMessageConverter.java:108) ~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.http.converter.xml.AbstractJaxb2HttpMessageConverter.createUnmarshaller(AbstractJaxb2HttpMessageConverter.java:80) ~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter.readFromSource(Jaxb2RootElementHttpMessageConverter.java:128) ~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter.readInternal(AbstractXmlHttpMessageConverter.java:69) ~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:199) ~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:114) ~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:739) ~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:672) ~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:313) ~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    at com.namecheap.apiclient.client.CallRestService.callRestService(CallRestService.java:13) ~[classes/:na]
    at com.namecheap.apiclient.client.CallRestService.run(CallRestService.java:19) ~[classes/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:795) ~[spring-boot-2.3.5.RELEASE.jar:2.3.5.RELEASE]
    ... 5 common frames omitted
Caused by: javax.xml.bind.JAXBException: null
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:196) ~[jaxb-api-2.1.jar:na]
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:385) ~[jaxb-api-2.1.jar:na]
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574) ~[jaxb-api-2.1.jar:na]
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522) ~[jaxb-api-2.1.jar:na]
    at org.springframework.http.converter.xml.AbstractJaxb2HttpMessageConverter.lambda$getJaxbContext$0(AbstractJaxb2HttpMessageConverter.java:110) ~[spring-web-5.2.10.RELEASE.jar:5.2.10.RELEASE]
    ... 18 common frames omitted
Caused by: java.lang.classNotFoundException: com.sun.xml.bind.v2.ContextFactory
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) ~[na:na]
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
    at java.base/java.lang.classLoader.loadClass(ClassLoader.java:522) ~[na:na]
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:192) ~[jaxb-api-2.1.jar:na]
    ... 22 common frames omitted

2020-11-02 02:03:27.538  INFO 34257 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

我想读取DomainCheckResult元素标签值。我如何读取该值?请我出来。 任何人都请帮助我。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)