Java 如何在spring boot中从pojo类返回所需参数作为json响应?
我想做的是, 如果我参加一个像这样的pojo课程Java 如何在spring boot中从pojo类返回所需参数作为json响应?,java,spring-boot,rest,Java,Spring Boot,Rest,我想做的是, 如果我参加一个像这样的pojo课程 @Entity @Table(name = "property_table") public class Property { @Id @Column(name = "property_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private int propertyId; @Column(nam
@Entity
@Table(name = "property_table")
public class Property {
@Id
@Column(name = "property_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int propertyId;
@Column(name = "property_name")
private String propertyName;
@Column(name = "property_type")
private String propertyType;
}
在RestController中,我编写了两个方法,如
@GetMapping(value = "/getProperties", produces = { "application/json",
"application/xml" }, consumes = { "application/xml", "application/json" })
@ResponseBody
public List<Property> getProperties() {
//some code
}
@GetMapping(value = "/getPropertyById", produces = { "application/json",
"application/xml" }, consumes = { "application/xml", "application/json" })
@ResponseBody
public Property getPropertyById() {
//some code
}
在上面的json中,我只想返回两个参数,即propertyId、propertyName和剩余的参数,即propertyType,我不想在json中重新运行
怎么能那样回来
对于第二个api方法,我想返回所有三个参数。i、 如下图所示
用于getPropertyById api方法
{
"property":[
{
"propertyId":001,
"propertyName":"PROPERTY 1"
},
{
"propertyId":002,
"propertyName":"PROPERTY 2"
}
],
{
"propertyId":001,
"propertyName":"PROPERTY 1",
"propertyType:"PROPERTY_TYPE 1"
},
如何使用相同的pojo类为不同的api方法使用不同的参数来维护不同的json响应。
请帮我解决这个问题。
谢谢。我强烈建议您在“db”层中隔离您的
@实体。因此,数据库端的更改不会影响API,反之亦然。此外,您还可以更好地控制API中公开的数据。根据您的需要,您可以创建两个真正的DTO,如PropertyTo
和PropertyDetailsTo
(或使用专用字段和getter/setter)
将您的@实体
映射到与您的需求相对应的特定dto
编辑
public List getProperties(){
返回toPropertyDtos(repository.findAll());
}
公共PropertyDetailsTo getPropertyById(长id){
返回toPropertyDetailsTo(repository.findBy(id));
}
在一些Mapper.java中
...
公共静态列表TopPropertyDTOS(列表属性){
返回properties.stream()
.map(映射器::TopPropertyTo)
.collect(toList());
}
私有静态属性yTo TopPropertyTo(属性属性){
PropertyTo dto=新的PropertyTo();
dto.propertyId=property.propertyId;
dto.propertyName=property.propertyName;
返回dto;
}
//对于'TopPropertyDetailsTo',您可以在'Mapper'中的单独私有方法中提取公共映射部分`
…REST API欠取/过取是一个众所周知的问题。只有两种(经典的方法)可以解决这个问题
第一个是为每个属性可见性状态构建一个模型。因此,在您的例子中,您需要创建两个不同的模型(这种模型称为DTO-Data Transfert对象)。一个模型将有一个propertyType
属性,另一个则没有。您共享的model属性
显示您使用了与entity和transfert对象相同的类。此解决方案将增加应用程序的复杂性,因为您必须实现一些映射程序才能将实体转换为相应的DTO
第二种方法是接受您发送的属性不会有用(请注意过度获取)。这种解决方案通常是最常用的。此解决方案的缺点是,当您不想向客户端发送某个信息时(想象一个用户
模型,您想从客户端获取密码,但不想将其发送回客户端)。另一个明显的缺点是事务会更大,但在大多数情况下可以忽略不计谢谢你,你的意思是我必须在代码中创建两个DTO类。如果你想在使用spring boot时保持与最佳实践相匹配的干净性,可以。dmytro给出了一个例子。对于映射,可以检查映射库。IMHO,这是一个很好的例子。谢谢dmytro,你能详细解释一下吗。如何映射@entity非常感谢您。
public class PropertyDto {
public String propertyId;
public String propertyName;
}
public class PropertyDetailsDto extends PropertyDto {
public String propertyType;
}
public List<PropertyDto> getProperties() {
return toPropertyDtos(repository.findAll());
}
public PropertyDetailsDto getPropertyById(Long id) {
return toPropertyDetailsDto(repository.findBy(id));
}
in some Mapper.java
...
public static List<PropertyDto> toPropertyDtos(List<Property> properties) {
return properties.stream()
.map(Mapper::toPropertyDto)
.collect(toList());
}
private static PropertyDto toPropertyDto(Property property) {
PropertyDto dto = new PropertyDto();
dto.propertyId = property.propertyId;
dto.propertyName = property.propertyName;
return dto;
}
// same stuff for `toPropertyDetailsDto`, you could extract common mapping parts in a separate private method inside `Mapper`