Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 31.08.2022
Сообщений: 3

WebFlux алгоритм работы с ошибками

26.11.2023, 12:14. Показов 1262. Ответов 0

Студворк — интернет-сервис помощи студентам
Всем привет.

Прошу помощи.

Алгоритм, который я хочу получить:
1. В контроллер CustomerHandler приходит запрос с queryParam email
2. Email проверяется на null и пустоту
3. Передается в CustomerServiceImpl
4. Если пользователь с таким email найден в БД, то выдай ошибку (вот тут первый вопрос. У меня работает, но, как по-мне, как-то костыльно написано. Как сделать это правильно?). Если пользователя нет, создай пользователя
5. Если пользователь создан, то верни ServerResponse, если ошибка, то верни JSON человеку со статусом ошибки и сообщением из эксепшена, который выдал сервис (вот тут второй вопрос. Никак не могу этого добиться)

Контроллер:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;
import ru.suspitsyn.iotcloud.customer.common.ApiError;
import ru.suspitsyn.iotcloud.customer.service.CustomerService;
 
@Component
public class CustomerHandler {
 
    public static final String EMAIL_NEEDED = "Необходимо передать параметр: email";
    public static final String USER_WAS_NOT_CREATED = "Пользователь не был создан";
    @Autowired
    private CustomerService combinedUserService;
 
    /**
     * Request should have queryParam("email")
     */
    public Mono<ServerResponse> createUserByEmail(ServerRequest serverRequest)  {
 
 
        String email = serverRequest.queryParam("email").orElseThrow(
                RuntimeException::new
        );
 
        if (email.equals("")) {
            throw new RuntimeException();
        }
 
        return combinedUserService.createCustomerWithChecks(email)
                .flatMap(customer ->
                    ServerResponse.ok().contentType(MediaType.TEXT_PLAIN)
                            .body(Mono.just(customer.getId().toString()), String.class)
                )
                //ВОПРОС ОПИСАННЫЙ В ПУНКТЕ 5. ЭТА ЧАСТЬ НЕ КОМПИЛИРУЕТСЯ
                .onErrorComplete(throwable -> ServerResponse.ok().contentType(MediaType.TEXT_PLAIN)
                            .body(Mono.just(new ApiError(throwable.getMessage())), ApiError.class)
                );
 
 
    }
 
 
}
Сервис
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
import ru.suspitsyn.iotcloud.customer.entity.Customer;
import ru.suspitsyn.iotcloud.customer.entity.CustomerRepository;
 
import java.time.LocalDateTime;
import java.util.Optional;
 
@Service
public class CustomerServiceImpl implements CustomerService {
 
    public static final String USER_EXISTS_ERROR = "Пользователь с почтой %s уже существует";
    @Autowired
    CustomerRepository customerRepository;
 
    @Override
    public Optional<Customer> getCustomerById(Long id) {
        return Optional.empty();
    }
 
    @Override
    public Mono<Customer> getCustomerByEmail(String email) {
        return customerRepository.findByEmail(email);
    }
 
    @Override
    public Mono<Customer> createCustomerWithChecks(String email) {
        return this.getCustomerByEmail(email)
                .flatMap(customer -> {
                /////////// ВОПРОС № 1 Без этой конструкции не работает
                    if (true) {
                        throw new RuntimeException(String.format(USER_EXISTS_ERROR, email));
                    }
              /////////// А ВОТ ЭТА ШТУКА, В ПРИНЦИПЕ, НЕ НУЖНА, НО БЕЗ НЕЕ НЕ РАБОТАЕТ
                    return Mono.just(customer);
                })
 
                .switchIfEmpty(this.createCustomer(email));
 
    }
 
    @Override
    public Mono<Customer> createCustomer(String email) {
        Customer customer = new Customer();
        customer.setEmail(email);
        customer.setCreateDateTime(LocalDateTime.now());
        return customerRepository.save(customer);
    }
 
 
 
}
Обертка для ошибки
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
 
import java.time.LocalDateTime;
 
/**
 * Class to throw Custom Api Errors in Response Entity
 */
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class ApiError {
    private LocalDateTime timestamp;
    private String message;
    private String debugMessage;
 
    public ApiError(String message) {
        this.message = message;
        this.timestamp = LocalDateTime.now();
        this.debugMessage = null;
    }
 
    public ApiError(String message, Throwable error) {
        this.message = message;
        this.timestamp = LocalDateTime.now();
        this.debugMessage = error.getLocalizedMessage();
    }
Добавлено через 2 часа 47 минут
UPD. Похоже, я победил.

Вот так контроллер работает, но мне опять один кусок кажется кривой

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public Mono<ServerResponse> createUserByEmail(ServerRequest serverRequest)  {
 
        //СТАРТ кривого куска
        Optional<String> email = serverRequest.queryParam("email");
        
        if (email.isEmpty() || email.get().equals("")) {
            return ServerResponse.badRequest()
                    .contentType(MediaType.APPLICATION_JSON)
                    .body(Mono.just(new ApiError(EMAIL_NEEDED)), ApiError.class);
        }
        //КОНЕЦ кривого куска
 
 
        return combinedUserService.createCustomerWithChecks(email.get())
                .flatMap(customer ->
                    ServerResponse.ok().contentType(MediaType.TEXT_PLAIN)
                            .body(Mono.just(customer.getId().toString()), String.class)
                )
                .onErrorResume(throwable -> Mono.just(new ApiError(throwable.getMessage()))
                        .flatMap(s -> ServerResponse.badRequest()
                                .contentType(MediaType.APPLICATION_JSON)
                                .bodyValue(s)));
 
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.11.2023, 12:14
Ответы с готовыми решениями:

Работы над ошибками
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; ...

Результат работы над ошибками по поводу глобальных переменных на с++
Данная статья выйдет в топ. По теме как делать глобальные переменные. Так как имею опыт в написание статей под нужды людей. Хочу...

EXCEPTION создана для работы с ошибками и не должна их отключать. Так ли это?
Всем доброго времени суток...:) Столкнулся с такой проблемой, я генерирую свою ошибку по заданному статусу, если ошибку не объявлять в...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.11.2023, 12:14
Помогаю со студенческими работами здесь

Неправильно использую webflux?
Привет. Трогаю руками сабж. Вроде как модно, современно, молодежно, но по факту оно работает медленнее, чем обычный jdbc. Вводные: БД...

работа с ошибками над ошибками из-за ошибок
Ребят схематично покажу. нужно сослаться на путь в сети.....беда в том, что не знаю букву диска. надо, чтобы если путь не найден,...

Не могу нормально разлогиниться в Spring WebFlux
Сделана аутентификация по jwt токену. Токен при помещается в куки при правильном вводе пароля и логина, т.е. при успешной ацтентификации....

Spring webflux работает только в 2 потока на nginx сервере
Добрый день. Использую приложение со spring webflux. Приложение делает 3 тысячи запросов за 20-30 секунд, в логах видна работа пары...

Разработайте алгоритм и программу, реализующую этот алгоритм. Исходные данные вводите из текстового файла. Результаты работы программы также помести
Разработайте алгоритм и программу, реализующую этот алгоритм. Исходные данные вводите из текстового файла. Результаты работы программы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru