【发布时间】:2021-11-18 16:20:44
【问题描述】:
我正在开发一个 Spring Boot 项目,其中 Mapstruct 用于将传入的 JSON 转换为对象。 JSON 包含地址信息,如 cityCode、stateCode。代码到名称的映射保存在自定义 address.yml 文件中。 (为了在 springboot 项目中配置自定义 yml,我引用了这个 link 并且能够从 @Service 层类中的 AddressProperties 获取数据。)
我需要使用 JSON 中的 cityCode 来自 yml 的城市名称,同时将传入的 JSON 映射到 Address 对象。 为此创建了一个 Mapper - AddressMapper。
这是课程-
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public abstract class AddressMapper {
@Autowired
AddressProperties addressProperties;
@Mappings({@Mapping(target = "cityName", expression = "java(addressProperties.getCity().get(address.getCityCode()))")})
abstract Address codeToName(AddressDTO address);
}
另一种方法-
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public abstract class AddressMapper {
@Autowired
AddressProperties addressProperties;
abstract Address codeToName(AddressDTO address);
@AfterMapping
public void populateNames(@MappingTarget Address address, AddressDTO addressDTO){
address.setCityName(addressProperties.getCity().get(addressDTO.getCityCode()));
}
}
但是,对于这两种方法,我都收到了NullPointerException。
AddressProperties 在这两种情况下都为空。
有没有办法在 Mapstruct 或 Spring boot 中映射和设置自定义 yml 文件中的字段值?
这是 AddressProperties.java 文件,它指向 'address.yml' 并加载值:
@Data
@Builder
@Configuration
@ConfigurationProperties
@PropertySource(value = "classpath:address.yml", factory = YamlPropertySourceFactory.class)
public class AddressProperties {
@Value("${city}")
private Map<String, String> city;
}
这里 YamlPropertySourceFactory 引用自 Baeldung 的 this 文章。
地址.yml
city:
101: AL
102: AK
103: AZ
104: AR
【问题讨论】:
-
"AddressProperties 在这两种情况下都为空。" -> 向我们展示您在哪里“声明”/如何加载! ;)
-
我可以得到addressproperties ref,但“城市”地图为空。
-
请同时显示 yaml 的(大纲/结构)。
标签: java spring-boot nullpointerexception yaml mapstruct