【发布时间】:2020-06-22 15:54:04
【问题描述】:
我有一个 Money 类,其中包含用于数值和字符串值的工厂方法。我想将它用作我的输入 Pojos 的属性。
我为它创建了一些转换器,这是字符串之一:
@Component
public class StringMoneyConverter implements Converter<String, Money> {
@Override
public Money convert(String source) {
return Money.from(source);
}
}
我的测试 Pojo 很简单:
public class MoneyTestPojo {
private Money value;
//getter and setter ommited
}
我有一个需要 Pojo 的端点:
@PostMapping("/pojo")
public String savePojo(@RequestBody MoneyTestPojo pojo) {
//...
}
最后,这是请求正文:
{
value: "100"
}
尝试此请求时出现以下错误:
JSON 解析错误:无法构造的实例
br.marcellorvalle.Money(尽管至少有一位创作者 存在):没有要反序列化的字符串参数构造函数/工厂方法 来自字符串值('100');嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException:不能 构造br.marcellorvalle.Money的实例(虽然在 至少存在一个创建者):没有字符串参数构造函数/工厂 在 [Source: (PushbackInputStream);行:8,列:19](通过参考链: br.marcellorvalle.MoneytestPojo[\"value\"])",
如果我更改 Money 并添加一个接收 String 的构造函数,此请求有效,但我确实需要一个工厂方法,因为我必须在特定情况下(零、null 和空字符串)提供 Money 的特殊实例。
我错过了什么吗?
编辑:按照要求,这里是 Money 类:
public class Money {
public static final Money ZERO = new Money(BigDecimal.ZERO);
private static final int PRECISION = 2;
private static final int EXTENDED_PRECISION = 16;
private static final RoundingMode ROUNDING = RoundingMode.HALF_EVEN;
private final BigDecimal amount;
private Money(BigDecimal amount) {
this.amount = amount;
}
public static Money from(float value) {
return Money.from(BigDecimal.valueOf(value));
}
public static Money from(double value) {
return Money.from(BigDecimal.valueOf(value));
}
public static Money from(String value) {
if (Objects.isNull(value) || "".equals(value)) {
return null;
}
return Money.from(new BigDecimal(value));
}
public static Money from(BigDecimal value) {
if (Objects.requireNonNull(value).equals(BigDecimal.ZERO)) {
return Money.ZERO;
}
return new Money(value);
}
//(...)
}
【问题讨论】:
-
你能告诉我们你的
Money类吗? -
@Joel 在最后添加了代码。
-
谢谢。刚刚回答
-
你解决了吗?
-
@Joel 是的...刚刚发布了一个答案。
标签: spring spring-boot jackson-databind