Spring MVC,从请求生成表单支持对象?

2023-12-01

我正在使用 Spring MVC 2.5,并且尝试从 GET 请求加载 JSTL 表单对象。我有 Hibernate POJO 作为我的支持对象。

请求中有一个页面指向另一个带有类 id(行主键)的页面。该请求类似于“newpage.htm?name=RowId”。这将进入带有表单支持对象的页面,

上面的新页面将对象的字段加载到可编辑字段中,并使用该行的现有值进行填充。这个想法是,您应该能够编辑这些字段,然后将它们保留回数据库中。

该页面的视图看起来像这样

<form:form commandName="thingie">
    <span>Name:</span>
    <span><form:input path="name" /></span>
    <br/>
    <span>Scheme:</span>
    <span><form:input path="scheme" /></span>
    <br/>
    <span>Url:</span>
    <span><form:input path="url" /></span>
    <br/>
    <span>Enabled:</span>
    <span><form:checkbox path="enabled"/></span>
    <br/>

    <input type="submit" value="Save Changes" />
</form:form>

控制器里有这个,

public class thingieDetailController extends SimpleFormController {

    public thingieDetailController() {    
        setCommandClass(Thingie.class);
        setCommandName("thingie");
    }

    @Override
    protected Object formBackingObject(HttpServletRequest request) throws Exception {
        Thingie thingieForm = (Thingie) super.formBackingObject(request);

        //This output is always null, as the ID is not being set properly
        logger.debug("thingieForm.getName(): [" + thingieForm.getName() + "]");
        //thingieForm.setName(request.getParameter("name"));
        SimpleDAO.loadThingie(thingieForm);

        return thingieForm;
    }

    @Override
    protected void doSubmitAction(Object command) throws Exception {            
        Thingie thingie = (Thingie) command;
        SimpleDAO.saveThingie(thingie);
    }
}

正如您从注释代码中看到的,我尝试从请求中手动设置对象 id(名称是本例)。然而,当我尝试将数据保留在表单中时,Hibernate 抱怨对象不同步。

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

这个错误似乎对整个会话产生了影响,导致我的整个 Web 应用程序停止工作,不断抛出上面看到的陈旧对象状态异常。

如果任何熟悉 Spring MVC 的人可以帮助我解决这个问题或提出解决方法,我将非常感激。

EDIT:
会话工厂代码。

private static final SessionFactory sessionFactory;
private static final Configuration configuration = new Configuration().configure();

static {
    try {
        // Create the SessionFactory from standard (hibernate.cfg.xml) 
        // config file.
        sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
    } catch (Throwable ex) {
        // Log the exception. 
        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}

使用 Spring MVC + hibernate 的主要缺陷之一是自然的方法是使用 hibernate 域对象作为表单的支持对象。 Spring 将默认根据名称绑定请求中的任何内容。这无意中包括 ID 或名称(通常是主键)或其他正在设置的 hibernate 托管属性之类的内容。这也使您容易受到表单注入的影响。

为了在这种情况下确保安全,您必须使用类似以下的内容:

protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) 
throws Exception {
 String[] allowedFields = {"name", "birthday"}
 binder.setAllowedFields(allowedFields);
}

并明确将允许的字段设置为仅表单中的字段,并排除主键,否则您最终会陷入混乱!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring MVC,从请求生成表单支持对象? 的相关文章

  • Spring Rest-API - 403 禁止错误响应

    我是 Spring 新手 我正在编写 REST API 我收到 403 删除 放置禁止错误 以下是我正在处理的示例 RequestMapping value noteId method RequestMethod PUT public Re
  • 如何在 Java 中根据 XSD 1.1 验证 XML?

    在 Java 中根据 XML Schema 1 1 验证 XML 文件的最佳方法是什么 我从中获取了代码tutorial http www ibm com developerworks xml library x javaxmlvalida
  • Android - 内容值覆盖现有行

    我正在尝试使用插入值ContentValues 我已将 5 个值插入到 5 列中 运行应用程序后 我只有最后一组值的行ContentValues 前四组未插入 ContentValues cv new ContentValues cv pu
  • 寻找 WebElements,最佳实践

    在我们当前的自动化 使用 Selenium WebDriver Java 中 我们使用 FindBy very广泛地 例如 FindBy css a name bcrumb protected List
  • 使用 Java 检索 Window 进程的 CPU 使用率

    我正在寻找一个 Java 解决方案来查找 Windows 中正在运行的进程的 CPU 使用情况 查了一下网上 关于Java解决方案的信息似乎很少 请记住 我并不是要查找 JVM 的 CPU 使用情况 而是要查找当时在 Windows 中运行
  • 如何在JUnit测试中将MockWebServer端口设置为WebClient?

    我在用着spring boot with WebClient 它被自动装配为一个 bean 问题 写一个junit集成测试 我必须使用okhttpMockWebServer 该模拟始终在随机端口上启动 例如localhost 14321 N
  • JPA 为每个项目选择最新实例

    假设我有一个会议实体 每次会议都有一个与会者和一个会议日期 在我的会议表中 我可能为每个与会者举行多个会议 每个会议都有不同的日期 我需要一个 JPA 查询 该查询将为所有与会者仅选择最新的会议 例如 如果我的桌子看起来像这样 Meetin
  • UnsupportedOperationException:特权进程中不允许使用 WebView

    我在用android sharedUserId android uid system 在我的清单中获得一些不可避免的权利 从 HDMI 输入读取安卓盒子 http eweat manufacturer globalsources com s
  • splitByWholeSeparatorPreserveAllTokens 和 split 之间的区别

    有什么区别StringUtils splitByWholeSeparatorPreserveAllTokens and String split With splitByWholeSeparatorPreserveAllTokens 我们可
  • Stream#limit 返回的元素是否可以少于预期?

    如果流s下面至少有n元素 流在什么情况下sLimit可能少于n元素 如果有的话 Stream sLimit s limit n 提问原因 在这个答案 https stackoverflow com a 28082107 829571 我读到
  • MAC OS 的 java.awt.Robot 类中出现无头环境错误

    我正在尝试使用 JavaFX 应用程序捕获屏幕截图Robot class 这是我在我的应用程序中使用的代码 Rectangle screenBounds new Rectangle Screen getPrimary getBounds g
  • 使用java读取Excel工作表的单列

    我有一张 Excel 表格 我想编写一个方法 该方法将参数作为要读取的列号 并返回一个由该列中的所有数据组成的数组 然后将该列元素放置在 xml 工作表中 我怎样才能编写一个方法来做到这一点 使用 Apache POI 您可以在他们的使用页
  • Restful WS 中的 WSDL 等价物是什么?如果没有,消费者如何生成所需的客户端类?

    比如说 我在java中有生产者 在 net中有消费者 生产者有一个方法 需要 员工作为方法参数并在数据库中创建员工 对于基于 SOAP 的 ws dot net 客户端将调用 WSDL 并创建存根 包括 dot net 中的员工数据表示 现
  • 捕获 XSS(跨站脚本)攻击的最佳正则表达式(Java 中)?

    杰夫实际上在净化 HTML http refactormycode com codes 333 sanitize html 但他的示例是用 C 编写的 而我实际上对 Java 版本更感兴趣 有人有更好的 Java 版本吗 他的示例是否足以直
  • 使用 Mockitos 传递参数化输入

    我正在使用 Mockito 进行单元测试 我想知道是否可以使用 Junit 测试中的方式发送参数化输入参数 e g InjectMocks MockClass mockClass new MockClass Test public void
  • 在Java程序中计算zip文件的md5哈希值

    我有一个 zip 文件 在我的 Java 代码中我想计算 zip 文件的 md5 哈希值 有没有我可以用于此目的的 java 库 一些例子将非常感激 谢谢 几周前我通过这篇文章做到了这一点 http www javalobby org ja
  • Java 8 Stream - 为什么过滤器方法不执行? [复制]

    这个问题在这里已经有答案了 我正在学习使用java流进行过滤 但是过滤后的流没有打印任何内容 我认为过滤器方法没有被执行 我的过滤代码如下 Stream of d2 a2 b1 b3 c filter s gt s startsWith b
  • Java中如何限制文件大小

    我正在我的应用程序中创建一个文件 并继续向该文件中写入一些内容 但是当我的文件达到一定大小 比如说 100 行 后 我想删除第一行并将新行写入底部 要求是我的文件应该受到限制 但它应该保留我写入文件的最新内容 请告诉我在Java中是否可行
  • servlet 如何获取 servlet 之外的文件的绝对路径?

    我们一直在使用 System getProperties user dir 来获取属性文件的位置 现在它已经部署在 Tomcat 上 通过 servlet 系统调用将位置指定为 tomcat 而不是属性文件所在的位置 我们如何动态调用属性文
  • 用于从链表中删除元素的大 O 表示法[重复]

    这个问题在这里已经有答案了 我正在阅读有关链接列表的内容 我发现 从链表中删除所需的元素需要 O n 运行时间 其中 n 是元素的数量 列表中的元素 http www cs mcgill ca dprecup courses IntroCS

随机推荐

  • Facebook php SDK getLogoutUrl() 问题

    当我想从我的网站注销用户时 我使用 logoutUrl facebook gt getLogoutUrl array next gt logout php And logoutUrl显示正确的链接 但它没有将我重定向到下一步中指定的网址 它
  • Drupal 7 - 根据内容数据隐藏内容编辑表单的某些表单字段

    在Drupal 7中 有没有办法根据特定内容更改内容类型的标准编辑形式 例如 我有一个带有复选框的内容类型 一旦选中并保存表单 我不希望该复选框再可见 因此 根据数据库中的复选框值 我想在以下情况下隐藏表单字段显示表格 我正在构建一个小型的
  • XML 到 LINQ 并检查空元素

    我面临的情况是使用 Linq 将 XML 文档解析为对象 在解析过程中 我会检查以确保 Elements 不为空 然后再继续解析它们的值 有没有办法简化这个声明 var variable from x in xdoc Descendants
  • 使用流按 List 对 Map 进行排序

    Map
  • Java 进度条反馈

    我有 MainProgramWindow GUI 该GUI有一些变量和一键调用Sql类的createExcel方法并同时启动进度条 public class MainProgramWindow extends javax swing JFr
  • Linphone Android:自签名证书的 TLS 握手错误

    我正在尝试使用自签名证书在 Linphone Android 中配置 TLS 以便能够与 FreeSWITCH SIP 服务器进行通信 但 SSL 握手失败并出现以下错误 通道 0x9ec3c000 SSL 握手失败 X509 证书验证失败
  • 在PYQT5 python中设置文本

    我的程序是基于人工智能的 我在 stackoverflow 中看到了所有关于 Pyqt 设置文本的帖子 我想在单击 自动 AI 按钮时在 lineEdit 中设置文本 def AI click self self lineEdit setT
  • 无法加载捆绑包中的 NIB

    由于未捕获的异常 NSInternalInconsistencyException 而终止应用程序 原因 无法在捆绑包中加载 NIB NSBundle 已加载 名称为 ViewLecturer ViewLecturer viewLectur
  • 使用 Spring Security SAML 将请求参数添加到 SAML 请求

    我需要向 SAML 请求添加请求参数 例如 locale en 以便让登录页面显示正确的语言 我怎么做 我尝试将该属性添加到作为参数发送给开始方法 SamlEntryPoint 的 HttpServletRequest 但这似乎不起作用 有
  • iOS 静态库 + CocoaPods 和重复符号错误

    我正在开发一个静态库 iOS 框架 Jeff Verkoeyen 方式 并且添加了 CocoaPods 来管理依赖项 这是与有关重复符号的其他问题的最大区别 当使用 CocoaPods 的客户端使用我的静态库 框架和我也在使用的第三方库时
  • QSound::play("soundpath") 调用有效,但 QSound 对象无效

    我正在尝试播放声音QSound模块 它尝试使用此代码并工作 QSound play sounds sources BeepSound wav 但我想要这个但不起作用 我创建了一个动态实例QSound并演奏 sounds new QSound
  • java 中的 new Date() 转儒略日期格式

    我需要将 new Date 转换为儒略日期格式 java 中是否有为此构建的函数 我的确切要求是 以儒略日期格式 0YYDDD 表示文件的创建日期 0 数字零 YY 年份的最后两位数 DDD 年内的天数 最多可以是传输日期之前的 7 个日历
  • 如何在 tkinter 中创建日期选择器?

    tkinter 应用程序是否有任何标准方式允许用户选择日期 如果有人仍然需要这个 这里有一个简单的代码 用于使用 tkcalendar 包创建日历和 DateEntry 小部件 pip install tkcalendar 用于安装包 tr
  • 使用 Spring Integration 同时读取 CSV 文件

    我想使用 spring 集成同时处理 CSV 文件 每行将被转换为单独的消息 所以假设我在 CSV 文件中有 10K 行 我想启动 10 个线程 每一行都会传递给这个线程 如果有人向我展示任何示例 那就太好了 Thanks 从 开始Spri
  • 如何编写 Delphi Galileo IDE Expert?

    HI 我想为 D2007 D2009 又名 Galileo IDE 编写一个小型的 Delphi IDE Expert 以便显示一个带有 TMemo 实例的窗口 以及上面备忘录中表单设计器的所有组件名称和类 所选组件将标有 专家应出现在菜单
  • 在 AWS Sagemaker 上安装 graphviz

    我在使用 Python3 的 Jupyter 笔记本上尝试使用如下代码绘制一棵树 import xgboost as xgb from xgboost import plot tree plot tree model num trees 4
  • 如何以编程方式确定 ndb 属性是否为多值

    我正在将应用程序从 Datastore 转换为 ndb 并且在 xml 导入例程中遇到问题 问题是我无法以编程方式确定 ndb model 类的属性是否是多值属性 我怀疑这是由于缺乏基本的 Python 技能 因为到目前为止我编写的代码显示
  • 将 Windows 7 手机的联系人列表集成到应用程序中

    如何获取 Windows 7 手机的联系人列表以在 win7 手机应用程序中使用 对于早期版本的 Windows Phone 7 SDK 只能使用选择器检索电话号码或电子邮件地址以及其他一些信息 现在 使用 7 1 Mango SDK 可以
  • 如何自动将版本号插入AssemblyName

    我试图建立在这个问题的基础上 从 MSBuild 中的文件读取单个值 我的目标是有一个位置来放置多个项目中使用的版本号 并且我还希望其中一个项目的 DLL 文件名中包含版本号的一部分 根据上面的问题 我已经得到了第一部分 但我在第二部分上遇
  • Spring MVC,从请求生成表单支持对象?

    我正在使用 Spring MVC 2 5 并且尝试从 GET 请求加载 JSTL 表单对象 我有 Hibernate POJO 作为我的支持对象 请求中有一个页面指向另一个带有类 id 行主键 的页面 该请求类似于 newpage htm