使用spring处理请求/响应中的非表单域的正确方法?
问题描述:
我有一个基于Hibernate的模型对象,比如有10个字段。我需要将其中的六个传递给Spring表单并将其取回,但其他四个不需要往返表单。但是,当Hibernate对象保存在数据库中时,他们需要坚持以更新/创建。如果我不需要,我宁愿不将它们作为隐藏字段放在表单上,其中一些可能有敏感数据。使用spring处理请求/响应中的非表单域的正确方法?
这样做的最好方法是什么?我已经在网上寻找解决方案,但信息/示例相当稀少。
我一直在创建一个Hibernate POJO的实例作为请求范围的Spring bean,但我似乎无法得到正确的语法。
答
无论是东西线创建基本DTO只使用六个字段,然后使用返回的反序列化数据更新实体。
或者只是序列化整个hibernate实体,然后反序列化回来并合并。
就你而言,真正的四个领域使圆形truip真的没有太大的区别。更可能的安全将是一个问题。
在我的应用程序中,我设置了一些转换服务来自动化实体的反序列化。
DTO在从一些不同的实体呈现数据以用于一种形式时非常有用。
不要创建请求作用域bean,这是矫枉过正。四个未使用的字段将坚持,他们坚持在数据库/存储在任何休眠缓存。
在优化之前担心您的api设计
答
如果模型的所有属性都不会发送到弹簧前端(表单隐藏),否则您将丢失数据,除非将它保存在某处(Session,StaticMap,数据库),这可能是一个代价高昂的操作。如果不想两次点击数据库,请将带有Key的静态映射放置为用户和对象标识,并为旧对象赋值。
答
我的方法是将一个单独的表单支持对象。沿
public class ModelForm {
//required fields
public ModelForm(Model model){
//set the values from model
}
//getters and setters
public void update(Model model){
//set values back to the model
}
}
public class ModelController {
public <return-type> submit(@ModelAttribute ModelForm form) {
Model model = loadModel(form);//Load the model object from DB using a id or some other property
form.update(model);
//other logic
save(model);
}
}