如何更改单值java对象的JSON表示?

jpfvwuh4  于 2022-12-15  发布在  Java
关注(0)|答案(2)|浏览(105)

我上过这样的课:

public class EmailAddress {
   public String value;

   public String tld() {...}
   public String host() {...}
   public String mailbox() {...}
}

现在我在对象/实体中使用这个类:

@Entity
public class Customer {
    public String name;
    public EmailAddress mail;
}

现在,当我为Customer执行rest服务时,我得到了以下格式:

{
    "id": 1,
    "name": "Test",
    "email": {
        "value": "test@test.de"
    }
}

但我只要"email": "test@test.de"

{
    "id": 1,
    "name": "Test",
    "email": "test@test.de"
}

我必须做什么?我使用Sping Boot 和Hibernate实体。
谢谢你的支持

kzmpq1sx

kzmpq1sx1#

您应该在请求处理中使用DTO类,并进行从DTO到实体以及反向的Map,例如:

public class CustomerDTO {
    private Integer id;
    private String name;
    private String email;
}
tyu7yeag

tyu7yeag2#

应该将DataTransferObjects用于(REST)API。DTO只包含接口应该提供(或接收)的字段。
从客户机接收对象时,在从Controller返回对象之前,可以将DTO转换为域模型(可以是JPA实体类)。
控制器方法的示例。我们假设您从用户编辑器中获取一个对象,该对象包含您希望在数据库对象中更新的所有数据,并返回更新后的公司DTO:

@PutMapping
public CustomerDto updateCustomer(CustomerEditorDto updatedCustomerDto) {
    Customer updatedCustomer = CustomerConverter.convert(updatedCustomerDto);
    updatedCustomer = customerService.updateCustomer(updatedCustomer);
    return CustomerConverter.convert(updatedCustomer);
}

和Converter类:

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class CustomerConverter {

    public static CustomerDto convert(Customer customer) {
        CustomerDto result = null;
        if (customer != null) {
            // TODO: set fields in result-dto
        }
        return result;
    }

    public static Customer convert(CustomerEditorDto customer) {
        Customer result = null;
        if (customer != null) {
            // TODO set fields in result;
        }
        return result;
    }
}

这是DTO

@Getter
@Setter
public class CustomerDto {
    private Integer id;
    private String name;
    private String email;
}

@Getter
@Setter
public class CustomerEditorDto {
    private Integer id;
    private String firstName;
    private String lastName;
    private String email;
    private String otherPropertyOrStuff; 
}

通过这种方式,您可以将API模型与JPA实体分离,可以使用相同的模型进行输入/输出,甚至可以使用不同的模型在服务内部工作,并最终在持久化数据之前(或阅读数据之后)将其转换为JPA实体。
有一些工具可以处理转换,如 mapstruct

  • 上面的注解@Getter@Setter,...来自项目lombok,非常便于自动生成样板代码。

相关问题