我在 yaml 中有一个属性
mail:
hostname: [email protected]
port: 9000
from: [email protected]
我想创建一个 Spring Bean 并将它们注入到必要的地方。 我想要一个辅助方法来以不同的格式呈现这个 bean
@Setter
@ToString
@Configuration
@ConfigurationProperties(prefix = "mail")
public class ClientProperties {
private String hostName;
private int port;
private String from;
private String time = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
public String toJson() throws JsonProcessingException {
return new ObjectMapper().writeValueAsString(this.toString());
}
public String getDigest() throws JsonProcessingException {
String fromJson = this.toJson();
String result = "";
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(fromJson.getBytes());
byte[] b = md.digest();
result = java.util.Base64.getEncoder().encodeToString(b);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return result;
}
}
我使用 Jackson 进行转换,但我听说为了简单的事情最好使用 GSON。 你能帮我理解如何从对象本身创建一个 json 因为 这个不行
public String toJson() throws JsonProcessingException {
return new ObjectMapper().writeValueAsString(this.toString());
}
我在这个方法 getDigest() 中做错了什么? 使用类似的东西更好吗
ObjectMapper mapper = new ObjectMapper();
byte[] body = mapper.writeValueAsBytes(jsonString);
byte[] digest = DigestUtils.md5Digest(body);
String encodeMD5String = Base64.getEncoder().encodeToString(digest);
您当前的方法将生成 json 字符串 -
"something"
。问题是你将类的字符串表示形式转换为 json。
要修复它,您应该只提供 当前实例,而不是其字符串化值。
public String toJson() throws JsonProcessingException {
return new ObjectMapper().writeValueAsString(this);
}
这将导致:
{
"port": 9000,
other props
}
此外,每次调用toJson()
时,无需为 ObjectMapper 创建新实例。您可以使用静态实例,也可以自动装配配置的实例 - 因为您使用的是 Spring Boot,所以很可能您已经将一个配置为 bean(Spring Boot 中默认使用 jackson)。
@Setter
@ToString
@Configuration
@ConfigurationProperties(prefix = "mail")
public class ClientProperties {
//properties
@Autowired
private ObjectMapper mapper;
public String toJson() throws JsonProcessingException {
return mapper.writeValueAsString(this);
}
}
public String toJson() throws JsonProcessingException {
return new ObjectMapper().writeValueAsString(this.toString());
}
应该使用对象,而不是对象的字符串版本。 (并且可能需要忽略该辅助方法以避免无休止的递归。)
@JsonIgnore
public String toJson() throws JsonProcessingException {
return new ObjectMapper().writeValueAsString(this);
}
与getDigest()
方法类似。我不确定它是否会影响 json 字符串的创建,但看起来这些私有字段上没有 getter 方法。为什么这些字段不是带有 getter 方法的 Final 字段?这个配置类是如何使用的?
此外,当 Jackson 位于类路径中时,
ObjectMapper
将是一个可用的 Spring bean,因此应该在需要的地方注入该 bean,而不是每次都创建一个新实例。