小编Pet*_*ski的帖子

Spring 验证失败时枚举字段上的自定义错误消息

我的 Spring DTO 中有一个枚举字段,我在@RestController. 我希望在验证此枚举字段失败时创建自定义错误消息:

public class ConversionInputDto {

    // validation annotations
    private BigDecimal sourceAmount;

    // enum field
    @NotNull(message = ERROR_EMPTY_VALUE)
    private CurrencyFormat targetCurrency;

    // no-args constructor and getters
} 
Run Code Online (Sandbox Code Playgroud)

在我的情况下,以字符串形式接收输入并进行自定义注释似乎是一种矫枉过正,而我知道的另一种选择是InvalidFormatException通过捕获所有错误@ControllerAdvise并为它们返回相同的错误(因此,用户提交例如数字属性的字符串输入将得到相同的错误消息):

@ExceptionHandler(InvalidFormatException.class)
public void handleInvalidEnumAndAllOtherInvalidConversions(HttpServletResponse response) throws IOException {
    response.sendError(HttpStatus.BAD_REQUEST.value(), ERROR_MESSAGE);
}
Run Code Online (Sandbox Code Playgroud)

当前的默认验证错误太长,我想让它更加用户友好,例如“无效的货币格式值。请选择......”

“无效的 JSON 输入:无法从 String \"test\" 反序列化类型值 com.foreignexchange.utilities.CurrencyFormat:不是 Enum 类接受的值之一:[AUD、PLN、MXN、USD、CAD];嵌套异常为 com.fasterxml.jackson.databind .exc.InvalidFormatException:无法com.foreignexchange.utilities.CurrencyFormat从字符串“test”反序列化类型值 :不是 Enum 类接受的值之一:[AUD、PLN、MXN、USD、CAD]\n,位于 [来源:(PushbackInputStream); 行: 3, 列: 20] (通过参考链: com.foreignexchange.models.ConversionInputDto[\"targetCurrency\"])",

有没有一种优雅的方法来解决这个问题?也许在@ExceptionHandler检查哪个字段验证失败时需要一些额外的逻辑?

java rest enums spring spring-boot

7
推荐指数
1
解决办法
6649
查看次数

重写 toString() 是否被视为多态?

我今天参加 Java 考试,考官问我是否可以提供在 Spring Boot 项目中使用多态性的示例。

由于我一开始想不出任何东西,他指出我在模型中重写了toString() ,这是动态/运行时多态性。

但是,我不确定我是否理解他的观点,因为根据我的理解,当我们有一个指向子类对象的父类引用变量(关注动态多态性)时,行为被认为是多态的。

然后在运行时,获取父类变量指向的实际对象并调用其方法,如此处很好地解释

但是,我在项目中没有使用向上转换(即使用 Object 类变量初始化 POJO 类)。

因此,我的问题是 -尽管父类(Object)从未用作引用变量,但重写 toString() 是否被视为多态?

我在 Stackoverflow 上找到的所有运行时多态性示例(包括此处的示例和带有toString 的示例)都说明了一种情况,即我们有一个父类变量指向子类对象,例如:

    Object object = new User("petar");
    String name = object.toString(); // assign to variable for clarity`s sake
    System.out.println(name);
    // prints petar
Run Code Online (Sandbox Code Playgroud)

我的用户类别是:

public class User {

    String name;

    public User(String name) {
        this.name = name;
    }

    public String toString() {
        return name;
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,在我的项目中,我只是使用自己的引用变量创建用户和其他 POJO 类,例如:

    User user = …
Run Code Online (Sandbox Code Playgroud)

java polymorphism overriding late-binding upcasting

5
推荐指数
1
解决办法
1753
查看次数