使用thymeleaf和spring boot时丢失的复杂对象
我有一个对象,里面有一个nesten复杂对象:使用thymeleaf和spring boot时丢失的复杂对象,spring,templates,spring-boot,thymeleaf,Spring,Templates,Spring Boot,Thymeleaf,我有一个对象,里面有一个nesten复杂对象: public class MonitoringSystem { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String name; private String url; private String username; private String password; @
public class MonitoringSystem {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
private String url;
private String username;
private String password;
@Transient
private String passwordConfirm;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name ="anonymization_id")
private Anonymization anonymization;
创建新对象或编辑现有对象时,我希望保留我的匿名对象。为此,我尝试将它保存在
中,就像我保存我的id一样
控制器:
@Controller
public class MonitoringSystemController {
// some Code
@RequestMapping("monitoringsystem/edit/{id}")
public String edit(@PathVariable Long id, Model model) {
model.addAttribute("monitoringsystem", monitoringSystemRepository.findOne(id));
return "monitoringsystem/form";
}
@RequestMapping("/monitoringsystem/new")
public String newMonitoringSystem(Model model) {
model.addAttribute("monitoringsystem", new MonitoringSystem());
return "monitoringsystem/form";
}
@RequestMapping(value = "/monitoringsystem/save", method = RequestMethod.POST)
public String save(MonitoringSystem monitoringSystem) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
User user = userRepository.findByUsername(auth.getName());
long id = user.getCloudProvider().getId();
anonymizationRepository.save(monitoringSystem.getAnonymization());
// more code
}
}
表格:
新的监测系统
系统名
统一资源定位地址
用户名
密码
确认密码
提交
不幸的是,这不起作用。当我尝试使用
monitoringSystem.getAnonymization()
在save方法中获取匿名化对象时,我得到的是Nullpointerexception
。所以我猜对象没有正确地存储在隐藏字段中。如何正确传递对象,使其在创建或编辑过程中不会丢失?您正在将整个对象绑定到字段。应该是
<input type="hidden" th:field="*{anonymization.id}"/>
我现在用另一种方式解决了我的问题。我离开了这个隐藏字段,将我的对象存储在会话中。在保存方法中,将它们从会话中拉出,并再次将其添加到我的monitoringSystem对象中。这是完美的,没有数据丢失 此外,它更节省,因为隐藏字段可以很容易地由用户操纵
但是感谢您的帮助。您是否在
监控系统
构造函数中实例化匿名化
?在newMonitoringSystem
-方法中,如果未在构造函数中创建匿名化,则匿名化
为空。在构造函数中实例化它:public MonitoringSystem(){this.setAnonymization(new Anonymization());}这是可行的,但我必须绑定每个字段,而不是:我的对象被传递,但没有来自对象中其他字段的所有数据,如匿名主机名等。如果能够在不考虑每个字段的情况下传递整个对象,那就太好了。有选项吗?您仍然可以保留您的监视系统
对象。即使添加所有字段,Spring Data JPA也会抱怨分离的匿名化对象。但是这应该通过CascadeType.MERGE
来解决。总而言之:绑定匿名化.id
隐藏字段->获取监控系统
实例并保存它。我测试了它。如果仅添加id,则会保存我的对象,但所有其他字段都具有默认值。如果我在input hidden中添加id和所有其他字段,我的对象将按原样保存(与所有现有数据一起保存)。顺便说一句:我的对象上已经有了CascadingType.ALL
<input type="hidden" th:field="*{anonymization.id}"/>