我有一个从第三方浏览器重定向回我的 Spring 控制器收到的地图,如下所示 -
@RequestMapping(value = "/capture", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public void capture(@RequestParam
final Map<String, String> response)
{
// TODO : perform validations first.
captureResponse(response);
}
Run Code Online (Sandbox Code Playgroud)
在使用此有效负载之前,我需要进行重要的验证,包括首先检查映射的非空值,然后在校验和验证中使用这些值。因此,我想使用 Spring Validator 接口以编程方式验证我的有效负载。但是,我找不到任何用于验证映射的验证器示例。
为了验证 Java 对象,我了解如何通过传递对象和 BeanPropertyBindingResult 以包含验证器的错误来调用验证器,如下所示 -
final Errors errors = new BeanPropertyBindingResult(object, objectName);
myValidator.validate(object, errors);
if (errors.hasErrors())
{
throw new MyWebserviceValidationException(errors);
}
Run Code Online (Sandbox Code Playgroud)
对于 Map,我可以看到有一个MapBindingResult扩展的类AbstractBindingResult。我应该简单地使用它,并将我的地图传递Object object给验证器并将其转换回 aMap吗?另外,验证器方法如何supports(final Class<?> clazz)在我的验证器中实现?是否就像下面的代码片段一样,只能有一个验证器支持 HashMap 的这一通用类?总感觉不太对劲。(虽然这对我来说并不重要,因为我将注入验证器并直接使用它,而不是通过验证器注册表,但仍然很好奇。)
@Override
public boolean supports(final Class<?> clazz)
{ …Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中编写了一个实用程序,它接受时区并返回一个日期(java.util.Date),如下所示 -
// Inside MyDateHelper.java
public static java.util.Date getTimeForTimeZone(String timeZoneId)
{
final Date currentDate = Calendar.getInstance(TimeZone.getTimeZone(timeZoneId)).getTime();
return currentDate;
}
Run Code Online (Sandbox Code Playgroud)
我在互联网上进行了研究,发现 Date 中没有任何时区信息。相反,它是一个从 1970 年开始的长值的包装器。所以,我的问题是我是否必须获取当前发生事务的日期时间时刻以存储在日期字段(类型为 java.util.Date)中),这个实用程序有什么用吗?
出于所有实际目的,这两行代码是否实现了相同的目的?
transactionEntry.setTime(MyDateHelper.getTimeForTimeZone("UTC+7:00"));
Run Code Online (Sandbox Code Playgroud)
或者
transactionEntry.setTime(new Date());
Run Code Online (Sandbox Code Playgroud)
我还检查了新的 Java 8 Time API,但就我的目的而言,我认为这样做也是一种矫枉过正,并且没有取得更多成果new Date()-
Date date4 = new Date();
LocalDateTime localDate = date4.toInstant().atZone(ZoneId.of("UTC+07:00")).toLocalDateTime();
final ZonedDateTime dateWithZone = localDate.atZone(ZoneId.of("UTC+07:00"));
Date dateOutput = Date.from(dateWithZone.toInstant());
transactionEntry.setTime(dateOutput);
Run Code Online (Sandbox Code Playgroud)
整个目的是捕获时区事务发生的时间,但我只能将时间存储为 java.util.Date。无论交易发生在哪个时区,Date 都能够正确捕获时间的瞬间,对吧?有人可以证实这种理解是正确的吗?