【问题标题】:Spring RestTemplate works for String but not for my classSpring RestTemplate 适用于 String 但不适用于我的班级
【发布时间】:2026-01-28 23:55:01
【问题描述】:

我的问题是,如果我调用这个 URL 并得到一个带有字符串的响应,我得到了它,但是没有 Class ESearchResult。我在这里做错了什么?请帮忙...

 String url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=covid";//config.getPmcUrl() + "esearch.fcgi?db=pubmed&term=covid";
    
    
    RestTemplate restTemplate = this.getRestTemplate();
    HttpHeaders headers = this.getHeaders();
    
    HttpEntity<ESearchResult> requestEntity = new HttpEntity<ESearchResult>(headers);
    
    //ResponseEntity<ESearchResult> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, ESearchResult.class);
    ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class);
    
    String  esearch = response.getBody(); //this works
    //ESearchResult  esearch = response.getBody();//this doesn't work

ESearchResult 类我检查是否带有命名空间。

@Getter
@Setter
@XmlAccessorType(value = XmlAccessType.FIELD)
@XmlRootElement(name = "eSearchResult", namespace = "http://eutils.ncbi.nlm.nih.gov/eutils/dtd/20060628/esearch.dtd")
public class ESearchResult {
    
    /*@XmlElement(name = "IdList", namespace = "https://eutils.ncbi.nlm.nih.gov/eutils/dtd/20060628/esearch.dtd")
    private List<IdList> idList;*/
    
    @XmlElement(name = "Count", namespace = "https://eutils.ncbi.nlm.nih.gov/eutils/dtd/20060628/esearch.dtd")
    private Integer count;
    
    @XmlElement(name = "RetMax", namespace = "https://eutils.ncbi.nlm.nih.gov/eutils/dtd/20060628/esearch.dtd")
    private Integer retMax;    

    @XmlElement(name = "RetStart", namespace = "https://eutils.ncbi.nlm.nih.gov/eutils/dtd/20060628/esearch.dtd")
    private Integer retStart;
    
}

来自 URL 的结果

【问题讨论】:

  • 你能分享你从这行收到的错误ESearchResult esearch = response.getBody();//this doesn't work

标签: java spring spring-resttemplate


【解决方案1】:

添加以下依赖:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

设置标题:

HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_XML));

这应该可以工作:

ResponseEntity<ESearchResult> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, ESearchResult.class);

ESearchResult esearch = response.getBody();

编辑:考虑RestTemplate 将被Webclient 替换。您可以使用以下内容设置正确的WebClient

WebClient wb = WebClient.builder()
            .defaultHeaders(header -> {
                header.setContentType(MediaType.APPLICATION_XML);
            })
            .exchangeStrategies(
                    ExchangeStrategies.builder()
                            .codecs(configurer -> {
                                configurer.defaultCodecs().jaxb2Decoder(new Jaxb2XmlDecoder());
                                configurer.defaultCodecs().jaxb2Encoder(new Jaxb2XmlEncoder());
                            })
                            .build()
            ).build();

然后用这个检索你需要的东西:

ESearchResult  esearch = wb.get().uri("https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=covid")
            .retrieve()
            .bodyToMono(ESearchResult.class)
            .block();

我之前添加的依赖项仍然需要。另外,你也需要这个:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

【讨论】:

  • 这很有帮助!正在工作,但我的属性为 null...
  • 出了点问题...我现在的错误是无法将 XML 解组为 ESearchResult 类。使用字符串。
  • 那是因为缺少 jackson-dataformat-xml。你检查过你的依赖吗?我在本地尝试过,效果很好。
  • 谢谢!正在工作,我只是删除了 Class 中的 @XmlRootElement 命名空间!
  • 太棒了!如果可行,请接受答案:)
最近更新 更多