Java Spring MVC:验证嵌套对象的id
主要问题 在我用Spring/Hibernate/Thymeleaf实现的web应用程序中,我有两个域对象,所有者和宠物。宠物对象有一个(可选)所有者字段。在通过web表单更新宠物的过程中,用户可以输入(数据库中)存在或不存在的所有者id 当用户使用现有所有者id更新宠物时,会找到现有所有者对象并将其与宠物关联。 但是,当用户使用数据库中不存在的所有者id更新宠物时,返回的宠物对象(在“POST”控制器方法中)的所有者对象为空。此外,由于pet域中的owner字段可能为空,因此不会产生验证错误 最终,这可能会导致用户提交错误的值,认为他们已经添加了一个所有者,而实际上宠物的更新是在一个空所有者的情况下进行的(如果没有正确捕获) 我的问题是,在执行父对象更新之前,验证嵌套对象的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字段可能为空,因此不会产生验证错误
- 我看到了一个相关的问题:,建议添加一个自定义验证器。在我的例子中,添加一个自定义验证器,它将在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";
}
}
}