Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.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
Java Spring MVC:验证嵌套对象的id_Java_Spring_Validation_Spring Mvc - Fatal编程技术网

Java Spring MVC:验证嵌套对象的id

Java Spring MVC:验证嵌套对象的id,java,spring,validation,spring-mvc,Java,Spring,Validation,Spring Mvc,主要问题 在我用Spring/Hibernate/Thymeleaf实现的web应用程序中,我有两个域对象,所有者和宠物。宠物对象有一个(可选)所有者字段。在通过web表单更新宠物的过程中,用户可以输入(数据库中)存在或不存在的所有者id 当用户使用现有所有者id更新宠物时,会找到现有所有者对象并将其与宠物关联。 但是,当用户使用数据库中不存在的所有者id更新宠物时,返回的宠物对象(在“POST”控制器方法中)的所有者对象为空。此外,由于pet域中的owner字段可能为空,因此不会产生验证错误

主要问题

在我用Spring/Hibernate/Thymeleaf实现的web应用程序中,我有两个域对象,所有者和宠物。宠物对象有一个(可选)所有者字段。在通过web表单更新宠物的过程中,用户可以输入(数据库中)存在或不存在的所有者id

当用户使用现有所有者id更新宠物时,会找到现有所有者对象并将其与宠物关联。 但是,当用户使用数据库中不存在的所有者id更新宠物时,返回的宠物对象(在“POST”控制器方法中)的所有者对象为空。此外,由于pet域中的owner字段可能为空,因此不会产生验证错误

最终,这可能会导致用户提交错误的值,认为他们已经添加了一个所有者,而实际上宠物的更新是在一个空所有者的情况下进行的(如果没有正确捕获)

我的问题是,在执行父对象更新之前,验证嵌套对象的id是否存在的推荐方法是什么

进一步思考:

  • 我看到了一个相关的问题:,建议添加一个自定义验证器。在我的例子中,添加一个自定义验证器,它将在PetController中运行,并验证Pet/Owner对象,我认为这不起作用。返回的pet对象包含一个空所有者对象,这是一个完全有效的状态。我需要在数据绑定期间进行验证。一旦进入控制器后绑定,所有者对象将为null,并且无法验证表单值
  • 通过添加一个自定义格式化程序(从字符串到所有者),我已经对它做了一些工作。如果找不到所有者id,此格式化程序将返回一个id为“Not found”的新所有者对象(在本例中是一些等效的数字/整数)。在我的控制器中,我可以检查具有“错误id”的所有者并引发错误。但是,不返回对象的默认行为似乎更安全,因为我的自定义格式化程序实际上返回了一个无效对象(这可能会导致其他问题?)
代码

@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
public class Pet {

    @Id
    private int id;

    private String name;

    @ManyToOne
    @Valid
    private Owner owner;
    
}

@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
public class Owner {

    @Id
    @NotNull
    @NonNull
    private int id;

    private String firstName;

    private String lastName;

}
@Controller
public class PetController {

    @Autowired
    PetRepository petRepository;

    @RequestMapping("editPet")
    @GetMapping
    public String editPet(Model model) {
        Pet pet =  petRepository.getById(1);
        model.addAttribute("pet", pet);
        return "editPet";
    }


    @RequestMapping("updatePet")
    @PostMapping
    public String updatePet(@Validated Pet pet, BindingResult bindingResult) {
        petRepository.save(pet); // if the user submits an invalid owner id, the returned pet will have a null owner 
        // object, but no error raised.
        return "editPet";
    }
}
}