我的 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 考试,考官问我是否可以提供在 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 ×2
enums ×1
late-binding ×1
overriding ×1
polymorphism ×1
rest ×1
spring ×1
spring-boot ×1
upcasting ×1