Spring Controller: используйте объекты домена как @RequestBody

У меня есть объектный класс домена Пользователь (это объект JPA):

@Entity
public class User {
   private String name;
   private boolean enabled = true;
   // getters/setters
}

И я пытаюсь предложить REST API, чтобы разрешить клиентов для создания новых пользователей с использованием Spring 3 MVC:

@Controller
public class UserController {
    @RequestMapping(value="/user", method=RequestMethod.POST)
    @ResponseBody
    public String createRealm(@RequestBody User user) {
            user.setEnabled(true); // client is not allowed to modify this field
            userService.createUser(user);
            ...
    }
}

Он отлично работает, но я не знаю, стоит ли использовать объекты домена как @RequestBody , потому что мне нужно защитить некоторые поля, которые не должны напрямую изменяться клиентом (т. е. "включены" в данном случае).

Каковы плюсы / минусы этих альтернатив:

  1. Используйте объекты домена и защищайте поля пользователю не разрешено изменять (например, вручную установить для них значение null или значение по умолчанию)
  2. Использовать новый набор дополнительных объектов (что-то похожее на DTO), например UserRequest который содержит только поля, которые я хочу открыть через REST API, и сопоставить их (то есть с помощью Dozer ) с объектами домена.

Вторая альтернатива выглядит так:

@Entity
public class User {
   private String name;
   private boolean enabled = true;
   // getters/setters
}

public class UserRequest {
   private String name;
   // enabled is removed
   // getters/setters
}

@Controller
public class UserController {
    @RequestMapping(value="/user", method=RequestMethod.POST)
    @ResponseBody
    public String createRealm(@RequestBody UserRequest userRequest) {
            User user = ... // map UserRequest -> User
            userService.createUser(user);
            ...
    }
}

Есть ли другие путь, который избегает дублирование кода и его легче поддерживать?

7
задан Bozho 12 August 2011 в 12:55
поделиться