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

Spring Boot Rest Controller如何自定义XML响应、修改标签及新增PDF字段

实现方案

Spring Boot默认使用Jackson XML组件实现XML响应序列化,按以下步骤操作即可完成需求:

步骤1:引入XML序列化依赖(未引入时添加)

Maven项目pom.xml添加如下依赖:

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

Gradle项目对应添加:

implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml'

步骤2:自定义XML标签+新增PDF字段

两种实现方式按需选择:

方案A:直接修改原有BTStatement实体类(无代码侵入要求时选)

使用Jackson XML注解修改标签名,同时新增PDF存储字段:

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

// 自定义XML根节点名称,替换默认的类名
@JacksonXmlRootElement(localName = "BusinessStatement")
public class BTStatement {
    // 原有字段通过localName属性自定义标签名
    @JacksonXmlProperty(localName = "StatementId")
    private Integer id;
    
    @JacksonXmlProperty(localName = "Operator")
    private String username;
    
    @JacksonXmlProperty(localName = "Department")
    private String agency;
    
    // 新增PDF字段,标签名设置为PDF
    @JacksonXmlProperty(localName = "PDF")
    private String pdfBase64;

    // 原有getter/setter保持不变,新增pdfBase64字段的getter/setter
    public String getPdfBase64() {
        return pdfBase64;
    }
    public void setPdfBase64(String pdfBase64) {
        this.pdfBase64 = pdfBase64;
    }
}

方案B:新建响应包装DTO(不侵入原有实体时选)

如果不想修改原有BTStatement的结构,新建XML响应专用DTO类:

@JacksonXmlRootElement(localName = "BusinessStatement")
public class BTStatementXmlDTO {
    @JacksonXmlProperty(localName = "StatementId")
    private Integer stmtId;
    // 其他需要返回的原有字段省略,按需自定义标签名
    @JacksonXmlProperty(localName = "PDF")
    private String pdfBase64;

    // 构造方法传入原始实体,拷贝属性并赋值PDF字段
    public BTStatementXmlDTO(BTStatement origin, String pdfBase64) {
        this.stmtId = origin.getId();
        // 其他属性拷贝逻辑省略
        this.pdfBase64 = pdfBase64;
    }
    // getter/setter省略
}

步骤3:修改控制器逻辑填充PDF字段

以方案A为例,修改原有控制器代码:

@GetMapping(value = "/byids/{statementsid}/{username}/{agency}")
public ResponseEntity<BTStatement> getStatementsByIds(@PathVariable("statementsid") int stmtId,
                                                      @PathVariable("username") String username,
                                                      @PathVariable("agency") String agency,
                                                      @RequestParam(name = "format", required = true, defaultValue = "PDF") String format) {
    try {
        BTStatement stmt = btStatementService.findById(stmtId);
        // 替换为你自己的PDF生成、转base64编码逻辑
        String pdfBase64Content = generatePdfAndToBase64(stmt);
        stmt.setPdfBase64(pdfBase64Content);
        return new ResponseEntity<>(stmt, HttpStatus.OK);
    } catch (Exception e) {
        System.out.println("NOT FOUND");
        return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }
}

如果使用方案B,将返回值类型改为ResponseEntity<BTStatementXmlDTO>,返回时构造对应DTO对象即可。

效果验证

你原有配置的WebConfig已经生效,接口默认返回XML,最终响应格式类似如下:

<BusinessStatement>
    <StatementId>1001</StatementId>
    <Operator>zhangsan</Operator>
    <Department>finance</Department>
    <PDF>JVBERi0xLjMKJcfsj6IKNSAwIG9iago8PC9MZW5ndGggNiAwIFIvRmlsdGVyIC9GbGF0ZURlY29kZT4+CnN0cmVhbQp4nE2NuwoCQQxF+/mKx...</PDF>
</BusinessStatement>

内容的提问来源于stack exchange,提问作者Olteanu Radu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:36:02