尝试使用 java spring boot、hibernate 和 thymeleaf 坚持使用 MAMP 但 运行 在验证时出错
Trying to presist to MAMP using java spring boot, hibernate and thmyeleaf but run into errors when validating
我已经构建了我的控制器、客户端和地址 class(模型),以及用于索引和添加的模板。当我尝试测试验证时,spring returns:
There was an unexpected error (type=Internal Server Error,
status=500). Validation failed for classes
[com.pooltracker.models.Address] during persist time for groups
[javax.validation.groups.Default, ] List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='Invalid',
propertyPath=zipCode, rootBeanClass=class
com.pooltracker.models.Address, messageTemplate='Invalid'}
ConstraintViolationImpl{interpolatedMessage='may not be null',
propertyPath=state, rootBeanClass=class
com.pooltracker.models.Address,
messageTemplate='{javax.validation.constraints.NotNull.message}'}
ConstraintViolationImpl{interpolatedMessage='Can not be empty',
propertyPath=street, rootBeanClass=class
com.pooltracker.models.Address, messageTemplate='Can not be empty'}
ConstraintViolationImpl{interpolatedMessage='Can not be empty',
propertyPath=city, rootBeanClass=class com.pooltracker.models.Address,
messageTemplate='Can not be empty'} ]
我了解到 hibernate 无法处理地址验证 class。我偶然发现了 bean 验证的主题。我对此很陌生,并试图找到解决我的问题的最佳方法,而不会在此刻走得太远。下面是我的控制器和模型。
@Controller
@RequestMapping("clients")
public class ClientController {
@Autowired
private ClientDao clientDao;
@Autowired
private AddressDao addressDao;
@RequestMapping(value = "")
public String index(Model model) {
model.addAttribute("clients", clientDao.findAll());
model.addAttribute("title", "My Clients");
return "clients/index";
}
@RequestMapping(value = "add", method = RequestMethod.GET)
public String displayAddClientForm(Model model) {
model.addAttribute("title", "Add Client");
model.addAttribute(new Client());
return "clients/add";
}
@RequestMapping(value = "add", method = RequestMethod.POST)
public String processAddClientForm(@ModelAttribute @Valid Client newClient,
Errors errors, Model model) {
if (errors.hasErrors()) {
model.addAttribute("title", "Add Client");
model.addAttribute("client", newClient);
return "clients/add";
}
clientDao.save(newClient);
return "redirect:";
}
}
Client
实体:
@Entity
@Table(name = "client")
public class Client {
@Id
@GeneratedValue
@Column(name = "client_id")
private int id;
@NotNull
@Size(min=1, message = "Client must have a first name")
@Column(name = "first_name")
private String firstName;
@NotNull
@Size(min=1, message = "Client must have a last name")
@Column(name = "last_name")
private String lastName;
@OneToOne(cascade = CascadeType.ALL,
fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "address_id")
private Address address;
@NotNull
@Size(min=10, max=10, message = "Must be 10 digits only")
private String phone;
// setters/getters
}
Address
实体:
@Entity
@Table(name = "address")
public class Address {
@Id
@GeneratedValue
@Column(name = "address_id")
private int id;
@NotNull
@Size(min=1, message = "Can not be empty")
@Column(name = "street")
private String street;
@NotNull
@Size(min=1, message = "Can not be empty")
@Column(name = "city")
private String city;
@NotNull
@Enumerated(EnumType.STRING)
@Column(name = "state")
private State state;
@NotNull
@Size(min=5, max=5, message = "Invalid")
@Column(name = "zip_code")
private String zipCode;
@OneToOne(mappedBy = "address" , fetch = FetchType.EAGER)
//@JoinColumn(name = "client_id")
public Client client;
// setters and getters
}
在 Client
class 中,将 @Valid
添加到 address
字段:
@Valid
@OneToOne(cascade = CascadeType.ALL,
fetch = FetchType.EAGER,
optional = false)
@JoinColumn(name = "address_id")
private Address address;
public @interface Valid
Marks a property, method parameter or method return type for
validation cascading.
我已经构建了我的控制器、客户端和地址 class(模型),以及用于索引和添加的模板。当我尝试测试验证时,spring returns:
There was an unexpected error (type=Internal Server Error, status=500). Validation failed for classes [com.pooltracker.models.Address] during persist time for groups [javax.validation.groups.Default, ] List of constraint violations:[ ConstraintViolationImpl{interpolatedMessage='Invalid', propertyPath=zipCode, rootBeanClass=class com.pooltracker.models.Address, messageTemplate='Invalid'} ConstraintViolationImpl{interpolatedMessage='may not be null', propertyPath=state, rootBeanClass=class com.pooltracker.models.Address, messageTemplate='{javax.validation.constraints.NotNull.message}'} ConstraintViolationImpl{interpolatedMessage='Can not be empty', propertyPath=street, rootBeanClass=class com.pooltracker.models.Address, messageTemplate='Can not be empty'} ConstraintViolationImpl{interpolatedMessage='Can not be empty', propertyPath=city, rootBeanClass=class com.pooltracker.models.Address, messageTemplate='Can not be empty'} ]
我了解到 hibernate 无法处理地址验证 class。我偶然发现了 bean 验证的主题。我对此很陌生,并试图找到解决我的问题的最佳方法,而不会在此刻走得太远。下面是我的控制器和模型。
@Controller
@RequestMapping("clients")
public class ClientController {
@Autowired
private ClientDao clientDao;
@Autowired
private AddressDao addressDao;
@RequestMapping(value = "")
public String index(Model model) {
model.addAttribute("clients", clientDao.findAll());
model.addAttribute("title", "My Clients");
return "clients/index";
}
@RequestMapping(value = "add", method = RequestMethod.GET)
public String displayAddClientForm(Model model) {
model.addAttribute("title", "Add Client");
model.addAttribute(new Client());
return "clients/add";
}
@RequestMapping(value = "add", method = RequestMethod.POST)
public String processAddClientForm(@ModelAttribute @Valid Client newClient,
Errors errors, Model model) {
if (errors.hasErrors()) {
model.addAttribute("title", "Add Client");
model.addAttribute("client", newClient);
return "clients/add";
}
clientDao.save(newClient);
return "redirect:";
}
}
Client
实体:
@Entity
@Table(name = "client")
public class Client {
@Id
@GeneratedValue
@Column(name = "client_id")
private int id;
@NotNull
@Size(min=1, message = "Client must have a first name")
@Column(name = "first_name")
private String firstName;
@NotNull
@Size(min=1, message = "Client must have a last name")
@Column(name = "last_name")
private String lastName;
@OneToOne(cascade = CascadeType.ALL,
fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "address_id")
private Address address;
@NotNull
@Size(min=10, max=10, message = "Must be 10 digits only")
private String phone;
// setters/getters
}
Address
实体:
@Entity
@Table(name = "address")
public class Address {
@Id
@GeneratedValue
@Column(name = "address_id")
private int id;
@NotNull
@Size(min=1, message = "Can not be empty")
@Column(name = "street")
private String street;
@NotNull
@Size(min=1, message = "Can not be empty")
@Column(name = "city")
private String city;
@NotNull
@Enumerated(EnumType.STRING)
@Column(name = "state")
private State state;
@NotNull
@Size(min=5, max=5, message = "Invalid")
@Column(name = "zip_code")
private String zipCode;
@OneToOne(mappedBy = "address" , fetch = FetchType.EAGER)
//@JoinColumn(name = "client_id")
public Client client;
// setters and getters
}
在 Client
class 中,将 @Valid
添加到 address
字段:
@Valid
@OneToOne(cascade = CascadeType.ALL,
fetch = FetchType.EAGER,
optional = false)
@JoinColumn(name = "address_id")
private Address address;
public @interface Valid
Marks a property, method parameter or method return type for validation cascading.