Как получить имя пользователя из моно <user>при весенней загрузке webflux? - PullRequest
1 голос
/ 01 июля 2019

Я пытаюсь сделать классы обработчиков и маршрутизаторов для весенней загрузки webflux. Класс модели - это класс пользователя. Коды

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Document(collection="Users") 
public class User {

    @Id 
    private String _id;

    @Indexed(unique = true) 
    private Long id; 

    @Indexed(unique=true)  
    private String username;

    private String password;

    private String email;

    private String fullname;

    private String role;
}

И ниже класс обработчика проекта webflux. В методе регистрации я делаю тестовые коды дублирования идентификаторов. Но это совершенно НЕПРАВИЛЬНО.

@Component
public class UserHandler {

    @Autowired
    private UserReactiveMongoRepository userRepository;

    public Mono<ServerResponse> register(ServerRequest request) {
        Mono<User> monoUser = request.bodyToMono(User.class);
        String id = monoUser.map(u -> u.get_id()).toString();

        if(userRepository.existsById(id) == null)
            return ServerResponse.ok().build(userRepository.insert(monoUser));

        return ServerResponse.ok().build();
    }
}

Я хочу извлечь имя пользователя или строку идентификатора из Mono of Spring webflux. Любые комментарии будут необходимы. Я застрял с этой частью.

Ответы [ 2 ]

3 голосов
/ 01 июля 2019

Одна из вещей, которая здесь не так, это как String id = monoUser.map(u -> u.get_id()).toString();. ToString вернет вам строку типа «Mono @ 13254216541», потому что вы вызываете Mono.toString.

Еще одна вещь, вы не должны использовать данные запроса в теле своей функции, но в функции map или flatMap.

Вы можете заменить это чем-то вроде (я делаю это по голове, чтобы он не был на 100% синтаксическим ядром):

Mono<User> userMono = request.bodyToMono(User.class);//Create a Mono<User>

userMono.map((user) -> { //In the map method, we access to the User object directly
  if(user != null && user.getId() != null){
    return userRepository.insert(user); // Insert User instead of Mono<User> in your repository
  }
  return null;
}) //This is still a Mono<User>
.map(insertedUser -> ServerResponse.ok(insertedUser)) //This is a Mono<ServerResponse>
.switchIfEmpty(ServerResponse.ok());

Надеюсь, это поможет!

1 голос
/ 01 июля 2019

более чистый подход (мне не нравится возврат нуля на карте, который сделали другие) - это использовать doOnSuccess:

request.bodyToMono(User.class)
    .doOnSuccess(user -> return userRepository.insert(user))
    .map(user -> ServerResponse.ok(user))

, я пропустил любые проверки ошибокно они должны быть выполнены правильно.

...