L'ho preso da uno dei tutorial video online. L'autore associa i dati del modulo non direttamente all'oggetto valore, ma prima al DTO valido e POI all'oggetto valore, utilizzando il servizio.
Esempio:
package com.foo.spring.dto;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
public class SignupForm {
@NotNull
@Size(min=1, max=255, message="{sizeError}")
@Pattern(regexp="[A-Za-z0-9._%-=]+@[A-Za-z0-9.=]+\.[A-Za-z]{2,4}", message="{emailValidationError}")
private String email;
@NotNull
@Size(min=1, max=100, message="{sizeError}")
private String name;
@NotNull
@Size(min=1, max=30, message="{sizeError}")
private String password;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "SignupForm [email=" + email + ", name=" + name + ", password="
+ password + "]";
}
}
Parte del controller:
@RequestMapping(value = "/signup", method = RequestMethod.POST)
public String signup(
@ModelAttribute("signupForm") @Valid SignupForm signupForm,
BindingResult result, RedirectAttributes redirectAttributes) {
if (result.hasErrors()) {
return "signup";
}
userService.signup(signupForm);
MyUtil.flash(redirectAttributes, "success", "signupSuccess");
Logger.debug(signupForm.toString());
return "redirect:/";
}
Parte del servizio:
@Override
public void signup(SignupForm signupForm) {
User user = new User();
user.setEmail(signupForm.getEmail());
user.setName(signupForm.getName());
user.setPassword(signupForm.getPassword());
userRepository.save(user);
}
La mia domanda è - si tratta di un vero DTO? Questa è considerata una buona pratica? (So che alcuni di voi odiano questo termine) O dovrebbe essere posizionato da qualche altra parte su un altro livello? Voglio dire, certo, è possibile eseguire la validazione dell'oggetto su Entity direttamente, ma ci sono molti casi (forme complesse) in cui si chiamano e si utilizzano più entità contemporaneamente, quindi si desidera spostare la convalida in una classe più specifica.