springboot使用jackson实现pojo和xml互相转换

springboot使用jackson实现pojo和xml互相转换

一、引入maven包

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

二、创建pojo

使用lombok快速创建

xml转换核心注解
@JacksonXmlElementWrapper:可以将列表数据转为XML节点。;
@JacksonXmlRootElement:指定生成xml根标签的名字;
@JacksonXmlProperty:指定包装标签名,或者指定标签内部属性名;
@JacksonXmlText:指定当前这个值,没有xml标签包裹。

package com.erfou.entity;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@JacksonXmlRootElement(localName = "xml")
public class PaylinxCallBack {
    @JacksonXmlProperty(localName = "bank_type")
    private String bank_type;

    @JacksonXmlProperty(localName = "cash_fee")
    private String cash_fee;

    @JacksonXmlProperty(localName = "cash_fee_type")
    private String cash_fee_type;

    @JacksonXmlProperty(localName = "fee_type")
    private String fee_type;

    @JacksonXmlProperty(localName = "result_code")
    private String result_code;

    @JacksonXmlProperty(localName = "return_code")
    private String return_code;

    @JacksonXmlProperty(localName = "time_end")
    private String time_end;

    @JacksonXmlProperty(localName = "total_fee")
    private String total_fee;

    @JacksonXmlProperty(localName = "transaction_id")
    private String transaction_id;

    @JacksonXmlProperty(localName = "mch_id")
    private String mch_id;

    @JacksonXmlProperty(localName = "nonce_str")
    private String nonce_str;

    @JacksonXmlProperty(localName = "out_trade_no")
    private String out_trade_no;

    @JacksonXmlProperty(localName = "platform")
    private String platform;

    @JacksonXmlProperty(localName = "sign")
    private String sign;
}

1.Java对象转XML

使用XmlMapper 的writeValueAsString方法进行转换

    @GetMapping("/toxml")
    public void toXml(){
        PaylinxCallBack paylinxCallBack = new PaylinxCallBack();
        paylinxCallBack.setSign("963852741");
        XmlMapper xmlMapper = new XmlMapper();
        try {
            String xml = xmlMapper.writeValueAsString(paylinxCallBack);
            System.out.println(xml);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }

转换结果

<xml>
	<bank_type/>
	<cash_fee/>
	<cash_fee_type/>
	<fee_type/>
	<result_code/
	><return_code/>
	<time_end/>
	<total_fee/>
	<transaction_id/>
	<mch_id/>
	<nonce_str/>
	<out_trade_no/>
	<platform/>
	<sign>963852741</sign>
</xml>

2.XML转Java对象

使用xmlMapper.readValue进行转化

 @GetMapping("/topojo")
    public void toPojo() throws IOException {
        String xml="<?xml version=\"1.0\"?>\n" +
                "<xml>\n" +
                "  <bank_type><![CDATA[CFT]]></bank_type>\n" +
                "  <cash_fee><![CDATA[3198]]></cash_fee>\n" +
                "  <cash_fee_type><![CDATA[CNY]]></cash_fee_type>\n" +
                "  <fee_type><![CDATA[AUD]]></fee_type>\n" +
                "  <result_code><![CDATA[SUCCESS]]></result_code>\n" +
                "  <return_code><![CDATA[SUCCESS]]></return_code>\n" +
                "  <time_end><![CDATA[20190218175517]]></time_end>\n" +
                "  <total_fee><![CDATA[659]]></total_fee>\n" +
                "  <transaction_id><![CDATA[4200000268201902183412918770]]></transaction_id>\n" +
                "  <mch_id><![CDATA[1234567]]></mch_id>\n" +
                "  <nonce_str><![CDATA[6saqecbgail2c08kgkgd1mrdfge8i6bb]]></nonce_str>\n" +
                "  <out_trade_no><![CDATA[A1550523295]]></out_trade_no>\n" +
                "  <platform><![CDATA[wechat]]></platform>\n" +
                "  <sign><![CDATA[9E86F28A2C6536509A133DC085AD0203]]></sign>\n" +
                "</xml>";
        XmlMapper xmlMapper = new XmlMapper();
        xmlMapper.setDefaultUseWrapper(false);
        xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        PaylinxCallBack paylinxCallBack=xmlMapper.readValue(xml,PaylinxCallBack.class);
        System.out.println(paylinxCallBack.toString());
    }

结果

PaylinxCallBack(bank_type=CFT, cash_fee=3198, cash_fee_type=CNY, fee_type=AUD, result_code=SUCCESS, return_code=SUCCESS, time_end=20190218175517, total_fee=659, transaction_id=4200000268201902183412918770, mch_id=1234567, nonce_str=6saqecbgail2c08kgkgd1mrdfge8i6bb, out_trade_no=A1550523295, platform=wechat, sign=9E86F28A2C6536509A133DC085AD0203)

### Spring Boot 中 DTO POJO 的区别及用法 #### 定义与作用 在Spring Boot项目中,DTO(Data Transfer Object)POJO(Plain Old Java Object)都用于表示业务逻辑中的数据结构。然而两者有着不同的用途。 - **POJO** 是一种简单的Java对象,通常用来映射数据库表或作为领域模型的一部分[^1]。 - **DTO** 主要用于封装来自不同服务层的数据,在各层次间传递复杂数据结构而不暴露内部细节。这有助于减少网络流量并提高性能[^3]。 #### 使用场景差异 当涉及到分层架构设计时: - 对于持久化操作,如保存、更新记录等,应该使用 **POJOs** 来代表实体类,并通过ORM框架自动映射至关系型数据库表格; - 当需要跨边界传输数据时,则应采用 **DTOs** 将必要的属性组合起来形成一个新的轻量级对象实例,从而避免不必要的字段被序列化发送给客户端或其他微服务组件[^2]。 #### 示例代码展示 下面是一个简单的例子来说明两者的定义方式及其相互之间的转换方法: ```java // Entity (POJO) @Entity public class User { @Id private Long id; private String name; private Integer age; // getters and setters... } // Data Transfer Object (DTO) public class UserDto { private final String userName; // 只返回所需的信息 public UserDto(String userName){ this.userName = userName; } // getter only for read-only field } ``` 为了简化从 `User` 到 `UserDto` 转换的过程可以借助第三方库ModelMapper完成自动化映射工作: ```java import org.modelmapper.ModelMapper; @Service public class UserService { private final UserRepository userRepository; private final ModelMapper modelMapper; @Autowired public UserService(UserRepository userRepository, ModelMapper modelMapper) { this.userRepository = userRepository; this.modelMapper = modelMapper; } public List<UserDto> getAllUsers() { return userRepository.findAll().stream() .map(user -> modelMapper.map(user, UserDto.class)) .collect(Collectors.toList()); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值