Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用thymeleaf和spring boot时丢失的复杂对象_Spring_Templates_Spring Boot_Thymeleaf - Fatal编程技术网

使用thymeleaf和spring boot时丢失的复杂对象

使用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; @

我有一个对象,里面有一个nesten复杂对象:

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}"/>