我有以下域名,需要返回选定的字段以响应客户端。如何使用Spring实现这一目标?
public class Vehicle {
private String vehicleId;
private Long dateCreated;
private String ownerId;
private String colourCode;
private String engineNumber;
private String transmission;
//getters & setters
}
我的目标是仅将colourCode
和transmission
字段返回给客户请求。我已经阅读了DTO,看起来我可以用DTO实现我的目标,但我找不到任何好的例子来实现它。 DTO是实现目标的正确方法吗?
答案 0 :(得分:2)
基本上你只需要用你需要的参数创建VehicleDTO类
public class VehicleDTO {
private String colourCode;
private String transmission;
//getters and setters
}
然后在你的代码中从Vehicle类构造VehicleDTO。幸运的是,我们有来自Spring的 BeansUtils 类,它使用反射将一个对象的属性复制到另一个对象,因为您不想重复逻辑来复制每个对象的属性。所以它会是这样的:
BeanUtils.copyProperties(v1, dto);
最后,您在回复中返回VehicleDTO而不是车辆
答案 1 :(得分:0)
您可以返回IVehicle
界面,该界面会公开您选择的属性
public interface IVehicle {
String getTransmission();
String getColourCode();
}
和你的Vehicle
实施它
public class Vehicle implements IVehicle{ }
答案 2 :(得分:0)
有多种方法可以达到你想要的效果。
您可以为资源添加相关的usecase / APi特定DTO。
e.g。如果您的API返回了车辆的一般细节,您可能希望公开某些级别的详细信息,
public class VehicleDetailsDTO {
private String colourCode;
private String transmission;
private String engineNumber; //more
//getters and setters
}
然后,您可以使用BeanUtils
或Dozzer
将Vehical
资源转换为可移动对象,例如DTO
。
BeanUtils:http://commons.apache.org/proper/commons-beanutils/
Dozzer:http://dozer.sourceforge.net/documentation/mappings.html
答案 3 :(得分:0)
假设您使用JSON作为输出格式而Jackson作为序列化引擎(在Spring MVC中默认使用),您可以tell Jackson to not serialize null properties。现在您只需要填充所需的属性并返回原始业务对象。