当前位置: 首页 > 知识库问答 >
问题:

如何正确实现Spring转换器?

姜胤
2023-03-14

我有一个Money类,它带有用于数值和字符串值的工厂方法。我想使用它作为我的输入POJO的属性。

我为它创建了一些转换器,这是字符串:

@Component
public class StringMoneyConverter implements Converter<String, Money> {
    @Override
    public Money convert(String source) {
        return Money.from(source);
    }
}
public class MoneyTestPojo {
   private Money value;
   //getter and setter ommited
}

我有一个需要POJO的endpoint:

@PostMapping("/pojo")
public String savePojo(@RequestBody MoneyTestPojo pojo) {
//...
}

最后,这是请求体:

{
   value: "100" 
}

尝试此请求时出现以下错误:

我是不是漏掉了什么?

编辑:正如所问的,下面是金钱类:

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);
    }
//(...)
}

共有1个答案

陈法
2023-03-14

使用@JSonCreator(来自com.fasterxml.jackson.annotation包)注释工厂方法将解决此问题:

  @JsonCreator
  public static Money from(String value) {
      if (Objects.isNull(value) || "".equals(value)) {
          return null;
      }

      return Money.from(new BigDecimal(value));
  }

我刚测试过,对我有效。除了示例请求(value应该在引号中)之外,您的其余代码看起来都很好,但我猜这只是一个错误。

更新1:

public class MoneyDeserializer extends StdDeserializer<Money> {

  private static final long serialVersionUID = 0L;

  public MoneyDeserializer() { 
    this(null); 
  }

  public MoneyDeserializer(Class<?> vc) { 
    super(vc); 
  }

  @Override
  public Money deserialize(JsonParser jp, DeserializationContext ctxt) 
    throws IOException, JsonProcessingException {
      JsonNode node = jp.getCodec().readTree(jp);
      String value = node.textValue();

      return  Money.from(value);
  }
}

只需在objectmapper中注册它。

 类似资料:
  • 问题内容: 假设我使用的是我不知道其源代码的库。它具有返回List的方法,如下所示: 我想知道这是否是个好主意: 例如,如果getObjs()中List的具体实现是a,那么是否会存在某种类型的差异? 问题答案: 不,这不是一个好主意。除非出于某种原因您需要从中执行特定操作,否则应始终使用接口()声明列表变量。 另外,如果您这样做,则需要确保返回的列表是。在这种情况下,的承诺合同只是返回类型是的某种

  • 我需要使用runOnUiThread来更新UI中的TextView,同时在从WebService获取一些字符串的工作线程中更新TextView。我看了一些其他的帖子,并试图实现提供的解决方案,但当我启动我的应用程序,它崩溃。我不太熟悉这个方法,所以我需要一些方向,如何解决这个问题。

  • 我有一个android应用程序,我正在尝试在其中实现linkedIn登录。LinkedIn SDK已经成功集成,我正在获取用户信息以及电子邮件地址。 以下是我的应用程序在谷歌登录时的工作方式: 1)在手机上获取访问令牌 2)发送带有访问令牌的电子邮件地址到服务器 3) 用我通过谷歌的webapi收到的访问令牌获取用户的详细信息。 4) 如果回复电子邮件与从移动设备接收的电子邮件匹配,则检查该电子邮

  • 问题内容: 我上课很难。麻烦的是,我正在尝试将包裹中的一个成员写入对象,这是一个对象。的是,和对象()在列表中的。 以下是相关代码: 我在“ //帮助这里”标记了两个点,以了解如何正确地写包裹以及如何对其进行重建。如果经过(正确测试),我该如何正确执行? 问题答案: 你差点知道了! 您只需要做: 就这样! 对于您的Integer列表,您还可以执行以下操作: 它应该工作。

  • 我正在寻找关于如何以及何时实现dispose模式的建议。 我已经阅读了MSDN关于如何实现dispose()模式的文章。说得通。我在我的类中实现了它,但它似乎对内存使用没有什么影响。 有点背景,我正在建立一个2D自顶向下的游戏引擎。我有一个名为Gatherer的单元,它继承自Actor(一个用于绘制sprite和跟踪viewplane的基本类),它们是一些简单的sprite。它们在5轮比赛后消失。

  • 我有一个。mp4视频文件,包含高级3.1“avc1.64001f”视频和低复杂度AAC“mp4a.40.2”音频。 如何通过使用libfdk_aacFFmpeg编码器将低复杂度AAC转换为“HE-AAC”音频编解码器并保持/获得尽可能好的质量?我只想将“avc1.64001f”视频复制到目标文件中。