当前位置: 首页 > 知识库问答 >
问题:

如何应用@initbinder来保护Spring MVC、Hibernate应用程序中的@version字段?

柴衡
2023-03-14

在一个带有Hibernate 4.1的Spring 3.1 MVC应用程序中,我正在使用:

  • 声明式事务管理
  • 每请求会话
  • 通过在域对象中添加“version”属性进行乐观锁定
  • 使用saveOrUpdate()重新附加分离的域对象

域对象在GET请求期间作为命令对象发送,以便由用户更新。

为了避免出现错误“乐观锁定失败;嵌套异常为org.hibernate.StaleObjectStateException:Row已被另一个事务更新或删除(或未保存值映射不正确)”,我在每个jsp页面中包含“ ”,更新工作正常。

为了进一步保护应用程序,我正在尝试向控制器添加以下内容:

@InitBinder
public void initBinder(WebDataBinder dataBinder, HttpServletRequest request) {
  if (request.getMethod().equals("POST")) {
   dataBinder.setDisallowedFields( new String[] {"version"});
  }
}

但当我这样做时,我得到的错误是乐观锁定失败;嵌套异常为org.hibernate.StaleObjectStateException:行被另一个事务更新或删除(或未保存值映射不正确)“。

有人能解释一下我想做的是不是一种有效的方法,我做错了什么?

共有1个答案

王经赋
2023-03-14

这看起来不正确,您不应该禁止版本字段的绑定--如果您不允许版本字段的绑定,那么您的命令对象将不具有您最初从DB为对象检索的版本字段,并且在持久化命令对象时,hibernate将假定该行已经被其他事务修改过(因为DB中的版本和命令对象不匹配)。

您可以尝试保护字段(id、version)等,仅在实体的第一次保存时(当id和version预期不存在时),但对于更新,原始id和version必须存在。

 类似资料:
  • 我试图把我的头缠在这个问题上2天现在,我找不到任何正确的解决方案在网上和论坛上这个问题。 我无法使用@login\u required decorator在flask应用程序中保护dash应用程序。我可以使用blueprint route中的@login\u调用dash应用程序,以确保其安全并将其重定向到dash应用程序。 但是如果我直接调用dash-applike_localhost:5000/

  • 问题内容: 我想使用PayPal出售Java应用程序。收到付款后,会向客户发送一次性下载链接到我的应用程序。 我的问题是,如何防止人们将.jar文件发送给他们的朋友/将其上传到互联网上? 显然,我需要在应用程序中进行某种检查,该检查仅允许它在一台计算机上运行。那是另一个问题,我不希望客户对一台计算机有限制,他们应该能够在家中和工作中运行它。 也许某种CD键可以解决问题?那里有Java的CD密钥资源

  • 问题内容: 我是软件开发的初学者,我想知道如何在Java应用程序中实施保护系统,以防止盗版。我知道没有完美的解决方案。但是我只想知道如何保护它。而且不要告诉我将其开源,就我而言这是不可能的:)。 感谢您的时间和答复。 问题答案: 由于可以轻松地破解任何许可证执行解决方案,因此我建议您完全不要尝试实现复制保护。许可证管理给您的用户带来不便。 如果确定要实施复制保护,则可以使用开源库。 此外,您应该混

  • 我试图在SpringMVC中运行SpringBoot应用程序,在SpringMVCPOM中添加SpringBoot应用程序依赖项,并扫描SpringBoot包,但我面临以下问题

  • 如何在客户端存储和保护私钥。 有什么方法可以保护JavaScript中的API密钥吗?。 我不能只是将它以纯文本形式放在那里,因为它可以被看到代码的其他人使用。那么,是否会有一个API保持秘密的实现呢?

  • 问题内容: 我有一个使用Flask用Python编写的小应用程序。现在,我正在nohup下运行它,但是我想使其守护进程。这样做的正确方法是什么? 问题答案: 使用gunicorn部署可能是最简单的方法,请先安装gunicorn,然后: 尽管你可能想使用主管或类似性质的工具来监视黑胶皮(at the very least use – so you can reload/stop gunicorn e