【问题标题】:Replace String via Java Spring Annotation通过 Java Spring 注解替换字符串
【发布时间】:2017-10-14 18:02:55
【问题描述】:

我需要从用户输入中替换或删除一些字符

设置后是否可以声明更改值的注释?

例如,我有带有用户名字段的 UserDTO 类。我想更改 Unicode 字符。

请注意我使用的是 Spring Data + Web Service

@PostMapping("/register")
public RestResult register(@Valid @RequestBody UserDTO userDTO){
  ...
}

【问题讨论】:

  • 您可能希望为 UserDTO 使用自定义反序列化程序。
  • 检查这个:mkyong.com/spring-mvc/…
  • @Shadov thx,它可能但较少处理类。我想为某些类使用字段或类级别的注释
  • 如果您使用的是 Jackson。您可以在@JsonCreator 中添加一些巧妙的逻辑,以便在传递给构造函数时处理您的逻辑
  • @shinjw thx,可能这就是答案。我会检查

标签: java spring spring-mvc annotations


【解决方案1】:

有两种方法。

您可以为用户名对象编写设置器来处理此逻辑。需要注意的是,通过您的设置器传递的任何用户名值都将通过您的字符串按摩。

public class UserDTO implements Serializable {
    @JsonProperty("username")
    private String username;

    public void setUsername(String username) {
        this.username = username.replace("A", "B");
    }

    public String getUsername() {
        return this.username;
    }
}

另一种可能的方法是使用Jackson提供的@JsonCreator注解。

您需要记住,这将成为使用 UserDTO 对象的所有对象的反序列化策略。但考虑到您正在寻找换出 unicode(很可能是内部可读格式),我想这将适合您的用例。

public class UserDTO implements Serializable {
    private String username;

    @JsonCreator
    public UserDTO(@JsonProperty("username") String username) {
        this.username = username.replace("A", "B");
    }

    public String getUsername() {
        return this.username;
    }
}

因此,当传入您的方法时,“ABC”将解析为“BBC”。在您的情况下,这可能是首选方法,因为它可以让您在需要时灵活地调整对象,而无需通过您的用户名字符串清理。由序列化和构造函数创建的对象将经过清理,但 setter 将按原样获取值。 getter 和 setter 中的逻辑很容易被理解。

【讨论】:

  • 非常感谢您的完整回答。但是是否可以为类或字段编写自定义注释???
  • 您是在谈论带注释的字段方法或类将执行的附加行为吗?
  • 暂时没有。我认为即使是杰克逊自定义解串器对我来说也是一个很好的解决方案。任何我喜欢使用它们的spring和hibernate注释
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2012-01-22
  • 2021-01-27
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多