【问题标题】:Getting a list of JSON Users objs. in a POST request and return a response also as JSON获取 JSON 用户对象列表。在 POST 请求中并以 JSON 形式返回响应
【发布时间】:2021-04-20 17:29:44
【问题描述】:

这是我第一次在 SpringBoot 中使用 spring-webflux。我的目标是创建一个 API,它在 POST 正文中接受 JSON 格式的用户列表,并返回包含该列表的响应,该列表也是按日期字段排序的 JSON 格式。排序不是问题,但我不太清楚如何制作这种架构。到目前为止,我有:

  • UserWebfluxApplication(带有@SpringBootApplication)

  • model/User.java (id, name, surname, creationDate)

  • 服务/UserService.java(接口)

  • service/UserServiceImpl.java 使用 WebClient 和以下方法实现接口:

      @Override
      public List<User> processUserDataFromUserList() {
              Mono<List<User>> response = webClient.get()
              .accept(MediaType.APPLICATION_JSON)
              .retrieve()
              .bodyToMono(new ParameterizedTypeReference<List<User>>() {});
    
              List<User> users = response.block();
    
              return users .stream()
              .sorted(Comparator.comparing(User::getCreatedTime))
              .collect(Collectors.toList());
      }
    
  • controller/UserController.java(在这里我不知道如何构建此类以达到我的成就,例如使用 curl、Postman 或其他工具测试请求)。到目前为止,我在 UserController 中有这个:

      @RestController
      public class UserController {
    
          @Autowired
          private UserService userService;
    
          @PostMapping(value = {"/readUser"})
          @ResponseStatus(HttpStatus.OK)
          public void readUser(@RequestBody List<User> users) {
              userService.processUserDataFromUserList();
          }
    
      }
    

json 请求会是这样的:

  {
    "id": 951,
    "name": "Marco",
    "surname": "Polo",
    "creationDate": "2021-01-23T02:36:09-08:00"
  },
  {
    "id": 952,
    "name": "Estela",
    "surname": "Star",
    "creationDate": "2021-01-14T18:30:09-07:00"
  },
  {
    "id": 953,
    "name": "Jim",
    "surname": "Pask",
    "creationDate": "2021-01-02T08:22:12+05:00"
  },
  {
    "id": 954,
    "name": "Lorena",
    "surname": "Cubo",
    "creationDate": "2021-02-15T01:01:32-02:00"
  }

提前谢谢你。

【问题讨论】:

  • 探索以响应实体为返回类型的spring控制器方法

标签: java json spring-webflux


【解决方案1】:

您似乎在混淆客户端代码和服务器代码。

我认为这样做可以:

控制器:

@RestController
public class UserController {

  @Autowired
  private UserService userService;

  @PostMapping(value = {"/readUser"})
  @ResponseStatus(HttpStatus.OK)
  public List<User> readUser(@RequestBody List<User> users) {
      return userService.processUserDataFromUserList(users);
  }

}

服务:

@Override
public List<User> processUserDataFromUserList(List<User> users) {
      return users.stream()
      .sorted(Comparator.comparing(User::getDuetime).reversed())
      .collect(Collectors.toList());
}

如果你想使用webflux,我想你只需要将List&lt;User&gt;改为Flux&lt;Employee&gt;即可。

@PostMapping(value = {"/readUser"})
@ResponseStatus(HttpStatus.OK)
public Flux<Employee> readUser(@RequestBody List<User> users) {
    return userService.processUserDataFromUserList(users);
}

这篇文章可能会澄清一些事情: https://www.baeldung.com/spring-webflux

【讨论】:

  • 使用您的解决方案,读取方法可以完美运行并接受 JSON 格式的用户列表,但正文响应为空(在 Postman 中测试)。另一方面,我有一个问题,如何在您的解决方案中使用 webFlux?谢谢@edubriguenti
  • 要使用 webFlux,我认为唯一的改变是返回一个 List,返回 Flux
【解决方案2】:

最后我通过以下方式解决了它:

控制器:

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping(value = {"/getByCreatedTimeAsc"})
    @ResponseStatus(HttpStatus.OK)
    public Flux<User> readUsers(@RequestBody List<User> users) {
        return userService.processUserDataFromUserList(users);
    }
}

服务:

@Service
public class UserServiceImpl implements UserService {

    @Override
    public Flux<User> processUserDataFromUserList(List<User> users) {
        return Flux.fromIterable(users.stream()
                .sorted(Comparator.comparing(User::getCreatedTime))
                .collect(Collectors.toList()));
    }

}

我面临的主要问题是我试图用 Mono 而不是 Flux 来管理列表。

【讨论】:

    猜你喜欢
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2018-11-23
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2012-09-26
    相关资源
    最近更新 更多