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

