我们使用Java EE 7和WildFly 9为移动/ Web应用程序开发自定义后端。后端是一个经典的3层系统,具有通信逻辑(JAX-RS),业务逻辑(会话EJB)和持久层(Hibernate)。指定服务返回的字段的最佳方式
业务逻辑层由一组服务组成,每个服务由一个接口和一个EJB实现定义。让我们假设
public interface IPostService {
List<PostDTO> getAllPosts();
}
和
@Stateless
public class PostService implements IPostService {
List<PostDTO> getAllPosts(){
// retrieving my Posts through Hibernate
}
有
public class PostDTO {
private Long id;
private String title;
// UserDTO is a VEEERY big object
private UserDTO author;
// getters and setters
}
让我们假设,有时,客户只关心后id
和title
。 API端点将接收带有要获取的字段列表的查询参数。所以,JSON序列化的DTO应该只包含后id
和title
。目标是避免不必要的处理,以便在不需要时加载非常大的对象UserDTO
。
一个天真的解决方案是将一个自定义List<String> desiredFields
参数添加到getAllPosts()
。这并不完全说服我,因为我们需要将此参数添加到几乎每服务方法的。
这样做的最佳做法是什么? Java EE对象是否有此目的?
也许创建一个简单的NameId值对象,让Hibernate为你构建VO实例列表?假设你使用JPA:http://stackoverflow.com/questions/2355728/jpql-create-new-object-in-select-statement-avoid-or-embrace – Gimby