170 похожих чатов

Так, в общем все вроде получилось, но не совсем. Вот

смотрите я сделал такую обертку для всех возвращаемых значений (и из методов контроллеров и из обработчиков ошибок):


public class ResultView<T> {
public final String status;
public final T value;
public final List<Object> errors;

private ResultView(String status, T value, Stream<Object> errors) {
this.status = status;
this.value = value;
this.errors = errors.collect(Collectors.toList());
}

public static <T> ResultView<T> success(T result) {
return new ResultView<>("success", result, Stream.empty());
}

public static <T> ResultView<T> error(Stream<Object> errors) {
return new ResultView<>("error", null, errors);
}

public static <T> ResultView<T> error(Object error) {
return error(Stream.of(error));
}
}

public class ValidationErrorView {
public final String message;
public final String field;

public ValidationErrorView(String message, String field) {
this.message = message;
this.field = field;
}
}

И все бы хорошо, но когда я именно возвращаю ошибки валидации вот так:


@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public ResultView<Object> processValidationError(MethodArgumentNotValidException e) {
Stream<ValidationErrorView> errors = e.getBindingResult().getFieldErrors().stream().map(x -> new ValidationErrorView(x.getDefaultMessage(), x.getField()));
return error(errors);
}
То у меня на фронт приходит вот такой json:

{
"status": "error",
"value": null,
"errors": [
{
"parallel": false
}
]
}
Что это за parallel не подскажете? Очень странно... Для обычных строк и success работает нормально.

2 ответов

5 просмотров

а зачем ты все в Stream оборачиваешь это фетиш такой

В BaseStream от которого Stream наследуется, есть метод isParallel, который говорит последовательный стрим у тебя или нет. Если ты маршаллер никак не тюнил, он наверняка это засунет в результат

Похожие вопросы

Обсуждают сегодня

А чем вам питонисты не угодили?😂
.
79
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
48
Есть предложения, как подобное можно упростить?
Hemul GM
12
У меня вопросик назрел. Почему, создав класс без наследования и реализации деструктора Destroy, деструктор не вызывался при free. Потом указал наследование от tobject и overri...
Сергей Бычков
8
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
just use free version ?? pycharm has a free version
Fan / Ac
9
Такой вопросец - есть функция function MySuperDuperConcat(const a: array of AnsiString): AnsiString; Как мне в её теле сделать вот так? Result:=Concat(a); А не грустный вариан...
notme
15
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
86
В си можно напрямую работает с памятью и процом?
Николай
7
Всем привет. Поделитесь, пожалуйста, опытом. Есть форма, на которой имеется dbgrid и кнопки: добавить, редактировать, удалить. Если нет записей в dbgrid, то кнопки редактирова...
Евгений
5
Карта сайта