L'oggetto modulo deve essere considerato un DTO?

0

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.

    
posta ex3v 02.12.2014 - 10:58
fonte

1 risposta

3

Non è un DTO reale, secondo questa definizione di DTO . In questa definizione, un DTO è un oggetto o un gruppo di oggetti semplificato, senza comportamento reale.

D'altra parte, è certamente un oggetto di trasferimento, per definizione, e certamente (probabilmente) può pacchettizzare più di un oggetto. Mettere la convalida, specialmente la convalida inter-oggetto in esso ha senso per me.

Il principio di non ripetere te stesso (ASCIUTTO) si applica qui. La convalida dell'oggetto business deve essere eseguita sia che si ottengano i dati da un database, da un front-end Web, da una GUI desktop o da una comunicazione tra applicazioni. Ciò significa che è necessaria la convalida nell'oggetto business.

Detto questo, esistono alcuni tipi di convalida che hanno senso solo per gli oggetti di trasferimento di pagine Web, in particolare quelli che implicano la traduzione di codifiche, ad esempio da CP1290 a UTF-8. Questi sono i tipi di convalida che devi fare sul modulo web.

    
risposta data 02.12.2014 - 14:16
fonte