Spring Boot Java 映射实体到 DTO : array literal (strings) INSTEAD of array of objects

标签 spring spring-boot jpa dto modelmapper

示例获取请求:http://localhost:3000/contact/1

我得到了什么:

{
  "id": 1,
  "firstname": "First Name",
  "lastname": "Last Name",
  "emailaddresses": [
    {
      "emailaddress": "email@gmail.com"
    },
    {
      "emailaddress": "email@g.c"
    }
  ]
}

我想要的:

{
  "id": 1,
  "firstname": "First Name",
  "lastname": "Last Name",
  "emailaddresses": ["email@gmail.com","email@g.c"]
}

下面的代码:

人与人

public class PersonDto {
    
    private Long id;
    private String firstname;
    private String lastname;
    private List<EmailAddressDto> emailaddresses;
    //getters setters
}

EmailAddressDto

public class EmailAddressDto {

    private String emailaddress;
    //getters and setters
}

服务类

public PersonDto getPerson(Long personId) { //this is the method inside the class

        Optional<PersonEntity> p = peopleRepository.findById(personId);
        var dto = modelMapper.map(p.get(), PersonDto.class);
        return dto;
}

我还有一个一对多映射到 EmailAddressesEntity 类的 PersonEntity 类。

我真的是 spring/java 的新手 - 我不知道如何获得我想要的 JSON 结构。

最佳答案

您可以使用 @JsonValue 注释 EmailAddressDtoemailaddress 字段,并保留所有内容。

public class EmailAddressDto {
    
    @JsonValue
    private String emailaddress;
    //getters and setters
}

使用上面的示例输出:

    PersonDto personDto = new PersonDto();
    personDto.setId(1L);
    personDto.setFirstname("John");
    personDto.setLastname("Doe");
    personDto.setEmailaddresses(Arrays.asList(new EmailAddressDto("john@doe.com"), new EmailAddressDto("foo@bar.com")));

    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(personDto);
    System.out.println(json);

是:

{"id":1,"firstname":"John","lastname":"Doe","emailaddresses":["john@doe.com","foo@bar.com"]}

关于Spring Boot Java 映射实体到 DTO : array literal (strings) INSTEAD of array of objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69555910/

相关文章:

java - 带非void返回值的@EventListener注释方法不会触发新事件

java - 如何在 Spring Boot 中使用 KMS 之前先解密 application.properties 中的密码

java - Spring data JPA - 没有找到依赖的合格bean

java - Kafka Spring 集成流程上的空指针

java - 如何将 getRealPath ("/") 路径从 .metadata 更改为 WEB-INF

java - Spring Boot 拦截器无论如何都会调用排除模式

java - JPA 更新没有效果

spring - grails 中特定于环境的 web.xml?

java - Spring Data 在哪里适合 Spring 7 模块?

java - 使用存储过程、JPA 和 Hibernate 保留到 SQL Server 2008