小编Har*_*mer的帖子

Jstl负零

如果您尝试以下位,您将获得-0

<c:set var="demo" value="-0.04" />
<fmt:formatNumber maxFractionDigits="1" value="${demo}" var="demo" />
Run Code Online (Sandbox Code Playgroud)

但是,如果你测试的是否小于0则说明是真的

<c:if test="${demo < 0.00}">...</c:if>
Run Code Online (Sandbox Code Playgroud)

我怎么能绕过这个?它似乎没有意义,0等于-0,我在代数中证明了它...在这篇文章中他们指向IEEE参考,但仍然,我无法解决问题

编辑:感谢您的评论,代码示例中存在错误.我将舍入值分配给演示变量.并且输出不是0,但是-0,我试过了

java jstl

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

基于Spring会话的javax约束验证

我想要完成的是在自定义约束中访问我的Spring Session

示例场景:

自定义约束@UniqueEmail验证电子邮件尚未在系统中使用.此验证在编辑端点上执行,如果用户没有更改电子邮件,则应忽略,第1:因为不需要它和第2:因为查询该电子邮件的数据库实际上将返回结果,即用户本身,虽然在没有访问会话的情况下无法告诉它

这有效:

如果我通过@InitBinder使用自定义编辑器的模型属性我可以在验证发生之前在待验证的bean中设置属性,就像这样

@InitBinder(value="myModelObj")
protected void initBinder(WebDataBinder binder, HttpSession session) {
    User user = (User) session.getAttribute("user");
    binder.registerCustomEditor(User.class, "user", new UidPropertyEditor(user));
}

@RequestMapping(...)
public String updateUser(@Valid @ModelAttribute("myModelObj") MyModelObj form){
    ...
}
Run Code Online (Sandbox Code Playgroud)

MyModelObj具有将被实际会话用户替换的属性.问题:

  1. bean中必须有一个属性来保存用户,即使它不能通过Web表单编辑
  2. Web表单也必须提交此属性,在我的情况下使用输入[type ="hidden"]字段(用户可以随意更改它,我们永远不会信任用户发送的内容)

这不起作用

新端点必须使用@RequestBody而不是@ModelAttribute,这意味着(afaik)@InitBinder将不再工作,因此失去对会话对象的访问权限.

如何(如果可能)我可以从自定义约束中访问会话?

public class EmailIsUniqueStringValidator implements ConstraintValidator<EmailIsUnique, String> {

@Autowired
private UserDAO userDAO;

HttpSession session; //Somehow initialized

@Override
public void boolean isValid(String email, ConstraintValidatorContext context) {
    User user = (User) session.getAttribute("user");
    if(user.getEmail().equals(email)){
        return true; // No need to validate
    }
    else if(userDAO.emailInUse(email)) …
Run Code Online (Sandbox Code Playgroud)

validation spring spring-mvc bean-validation

4
推荐指数
1
解决办法
1079
查看次数

如何在某些情况下允许忽略javax.validation

鉴于以下课程

public class Website {

    @NotNull
    String owner:

    @ValidUrl
    String url;

}
Run Code Online (Sandbox Code Playgroud)

当我们验证(例如使用@Valid)并且如果Website.url不遵守我的自定义@ValidUrl约束时,我们将获得约束违规(例如"url is unreachable").

我想知道如果用户愿意,是否可以忽略该验证.

脚步:

  1. 第一次验证表格
  2. 抛出约束违规并将其显示给用户
  3. 用户选择"我知道,无论如何添加它"并重新提交
  4. 第二次验证表单,验证除@ValidUrl之外的所有内容

java validation hibernate

2
推荐指数
1
解决办法
3880
查看次数

如何真正丢弃迟到的记录?

这是问题所在:

假设有一个数字流,我想从这些数字中收集 1 小时时段的 MAX,其中我允许给定时段最多 3 小时的延迟。

这听起来像是翻滚窗户的实验室案例。

这是我到目前为止所拥有的:

stream.aggregate(
      () -> 0L,
      (aggKey, value, aggregate) -> Math.max(value, aggregate),
      TimeWindows.of(TimeUnit.HOURS.toMillis(1L)).until(TimeUnit.HOURS.toMillis(3L)),
      Serdes.Long(),
      "my_store"
)
Run Code Online (Sandbox Code Playgroud)

首先,我无法验证这是否确实发生在测试中。时间戳是通过 TimestampExtractor 提取的,我模拟延迟Thread.sleep(我将窗口设置为较小的测试值),但“延迟记录”仍然被处理而不是被丢弃。

常规窗口上似乎很少(没有?)示例。有一个关于 SessionWindows 的集成测试,但就是这样。我是否正确理解了这些概念?

编辑 2

示例 JUnit 测试。由于它相当大,我通过 Gist 分享它。

https://gist.github.com/Hartimer/6018a731753846c1930429716703e5a6

编辑(添加更多代码)

数据点具有时间戳(收集数据的时间)、收集数据的机器的主机名和值。

{
    "collectedAt": 12314124134, // timestamp
    "hostname": "machine-1",
    "reading": 3
}
Run Code Online (Sandbox Code Playgroud)

自定义时间戳提取器用于获取collectedAt. 这是我的管道的更完整表示:

{
    "collectedAt": 12314124134, // timestamp
    "hostname": "machine-1",
    "reading": 3
}
Run Code Online (Sandbox Code Playgroud)

测试的一个片段是

source.map(this::fixKey) // Associates record with a key like "<timestamp>:<hostname>"
  .groupByKey(Serdes.String(), roundDataSerde) …
Run Code Online (Sandbox Code Playgroud)

apache-kafka apache-kafka-streams

2
推荐指数
1
解决办法
699
查看次数