我正在使用Dropwizard和JDBI构建REST API,我需要使用相同资源的不同表示。
我们使用events
资源的示例:
event
资源包含属性field1
,field2
,field3
和field4
。
POST /events
创建新事件时,请求正文应包含所有属性。GET /event/1
提取活动时,回复正文应仅包含field1
和field2
。GET /event/1
获取活动时,回复正文应包含field1
,field2
和field3
。当涉及资源bean,jdbi查询和资源映射器时,处理这个(#2和#3)的最佳(简单)方法是什么?
为每个表示分隔bean / mapper / query(不是很干,即使是扩展的基础bean)?在构建响应对象之后对其进行过滤(不是很优雅,可能很脆弱,容易意外暴露太多数据)?
答案 0 :(得分:1)
此案例不需要单独的映射器/查询。当业务模型和响应之间存在差异时,我们应始终使用DTO(数据传输对象)进行响应。可以说,你有商业模式,如
public class Event {
private String field1;
private String field2;
private String field3;
private String field4;
}
使用此模型创建活动。对于抓取事件,应该有两个DTO。
public class NormalUserEventDto implements IEventDto{
private String field1;
private String field2;
}
public class SuperUserEvent implements IEventDto {
private String field1;
private String field2;
private String field3;
}
对bean映射器的查询仍然可以给出事件模型。根据用户的不同,您可以提供DTO。有一些库可用于将一个bean转换为另一个bean。您也可以使用它,或者您也可以编写要转换的逻辑。