2011-08-12 23 views
5

gibi etki alanı nesne sınıf var User (bir JPA varlıktır):Bahar Denetleyici: Kullanım alanı nesneleri @RequestBody

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

Ve istemcilerin yeni kullanıcılar oluşturmak için izin REST API sunuyor çalışıyorum Bahar 3 MVC kullanarak:

@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); 
      ... 
    } 
} 

Büyük çalışır, ancak için iyi bir fikir @RequestBody olarak etki nesneleri kullanmak olup olmadığını olmamalıdır bazı alanları korumak zorunda çünkü bilmiyorum doğrudan müşteri tarafından değiştirildi (Yani Bu durumda "etkin".

artıları/eksileri bu alternatiflerden nelerdir:

  1. Kullanım alanı nesneleri ve örnek boş veya tarafından varsayılan değerine bunları ayarlamak için (kullanıcı değiştirmesine izin verilmez alanları korumak el)
  2. Kullanım Auxiliar bir yeni bir dizi için) bu tür sadece ben REST API aracılığıyla açığa istediğiniz alanları içeren bir UserRequest gibi bir DTO), benzer (bir şey nesneleri ve yani Dozer ile (onları map etki alanı nesneleri.

ikinci alternatif şuna benzer: Kod tekrarını önler ve bakımı daha kolay olan başka bir yolu

@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); 
      ... 
    } 
} 

var mı?

cevap

5

başka seçenek yoktur - Kullandığınız, özellikleri belirli bir dizi sunulmasını izin vermeyebilir DataBinder.setDisallowedFields(..) (veya kullanan .setAllowedFields(..))

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.setDisallowedFields(..); 
} 

Eğer farklı bir veya iki özelliği varsa bu gayet iyi. Aksi halde, özel bir nesneye (ProfileDetails veya UserRequest gibi) sahip olmak daha mantıklıdır. Ben ayrı bir varlık olarak tüm profil ilgili alanları koymak,

Üçüncü, belki daha iyi bir seçenek olduğunu bu senaryo için böyle bir DTO benzeri bir nesne kullanarak ve sonra commons-BeanUtils gelen BeanUtils.copyProperties(..) ile alanları aktarmak am (@OneToOne ile eşleştirilmiş kullanıcı ile) veya bir @Embeddable nesnesine ve bunun yerine kullanın.

+0

Harika cevap Bozho, teşekkürler. Açıklamak istemediğiniz alanları (Baharın böyle bir şey sunmadığını düşünüyorum) ek açıklamalarda bulunmak için İzin verilmeyen bir ek açıklama oluşturma hakkında ne düşünüyorsunuz ve binder.setDisallowedFields (MyUtils.findDisallowedFields (User.class)) çağrısı yapın? İzin Verilen bir açıklama daha da güvenli olabilir. –

+0

evet, makul geliyor. – Bozho

+0

Üzgünüm, seni rahatsız ediyorum. Belki bir tür AOP noktası kullanmak için iyi bir yer olduğunu düşünüyor musunuz? –

İlgili konular