如果您尝试以下位,您将获得-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,我试过了
我想要完成的是在自定义约束中访问我的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具有将被实际会话用户替换的属性.问题:
这不起作用
新端点必须使用@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) 鉴于以下课程
public class Website {
@NotNull
String owner:
@ValidUrl
String url;
}
Run Code Online (Sandbox Code Playgroud)
当我们验证(例如使用@Valid)并且如果Website.url不遵守我的自定义@ValidUrl约束时,我们将获得约束违规(例如"url is unreachable").
我想知道如果用户愿意,是否可以忽略该验证.
脚步:
这是问题所在:
假设有一个数字流,我想从这些数字中收集 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)