【问题标题】:Optional Joda DateTime type field with JSR 303 Validation and Spring converter带有 JSR 303 验证和 Spring 转换器的可选 Joda DateTime 类型字段
【发布时间】:2014-12-03 02:46:06
【问题描述】:

我有一个自定义参数转换器和 Jackson 映射器来处理 Spring 控制器输入上的 Joda DateTime

问题是,如果日期格式错误,服务器会给出400 Bad Request,因为在转换过程中 Joda 格式化程序会抛出 IllegalArgumentException

我可以让转换器在转换失败时返回 null(用户键入错误的日期模式),但这会在两种情况下给我 null:

  • 用户留空字段(在可选字段中可以)
  • 用户提供的日期格式不正确(永远不会正确)

如何区分这些场景“允许为空(空字段),但如果不为空,检查日期格式”?

背景:字段在 POJO 中表示为 DateTime,在 @Controller 中接收为 @RequestBody @Valid,因为它是 AJAX 发布的。

形成 POJO:

class MyForm {
@NotEmpty
private String name;

private DateTime expireOn; // JODA, optional but won't bad-format as null.

// getters, setters
}

【问题讨论】:

  • 请发布您的 POJO
  • @Amrola 添加了 POJO 表单
  • 你也使用休眠验证吗?
  • @amrola 是的。也许在 Joda 转换期间某些错误配置给了我 400 Bad Request?它应该默认为绑定结果错误还是 400 代码? (在我的自定义 Spring 转换器中抛出 IllegalArgumentException)

标签: java spring spring-mvc jodatime bean-validation


【解决方案1】:

我认为您应该使用@ScriptAssert,如下所示:

@ScriptAssert(lang = "javascript", script = "_this.validateExpireOn(_this.expireOn)")
 public class MyForm{


       public boolean validateExpireOn(Object obj){

            // here you check your expireOn Object if null or not , if not null check date format
            // this method should return boolean as if valid or not valid 
       }

        private DateTime expireOn;

}

希望有所帮助。

【讨论】:

  • 你一定知道我没有机会去控制器甚至JSR bean验证。 400 Bad Request 可能是由 Spring 转换器触发的,它在 JSR 验证之前启动
  • 您的问题是:如何区分这些场景以“允许空(空字段),但如果不为空,请检查日期格式”?
  • 是的,如果用户输入 not-empty-with-bad-format 日期,那么你的 @ScriptAssert 甚至不会触发,因为 JSR 验证不会触发,因为 Spring coversion 将强制 400 个错误请求
猜你喜欢
  • 2018-08-15
  • 1970-01-01
  • 2013-01-31
  • 2011-08-15
  • 1970-01-01
  • 2011-05-10
  • 2013-11-23
  • 2013-12-27
  • 2011-10-23
相关资源
最近更新 更多