Я бы переписал этот код следующим образом:
@PostMapping("/cards")
public Mono<ResponseEntity<?>> addCard(@RequestBody Card card) {
return repo.findOneByWord(card.getWord()) // (1)
.map(c -> // (2)
ResponseEntity.unprocessableEntity() // (2.1)
.body("Card already exists.") //
) //
.switchIfEmpty( // (3)
repo.save(card) // (3.1)
.map(c -> ResponseEntity.ok(c) // (3.2)
); //
}
Mono
со значением или пустой ответ. .map
, поэтому мы сопоставим карту с ответом 422 .map
будет пропущен, поэтому издатель, прошедший через .switchIfEmpty
, будет подписан. Обратите внимание на , нет необходимости обертывать создание резервной копии Mono
(пункты 3.1) в Mono.defer
, так как сохранение фактического элемента произойдет только в случае подписки на данный поток. Следовательно, поскольку это выполнение происходит только тогда, когда обрабатывается swithIfEmpty
, мы можем уменьшить ненужную упаковку. Наконец, в точке (3.2) результат будет сопоставлен с ответом 200 с сохраненным объектом Card
. См. Спецификацию gluDisk
:
void gluDisk( GLUquadric* quad, GLdouble inner, GLdouble outer, GLint slices, GLint loops);
Параметры
blockquote>
[...]
slices
Определяет количество подразделений вокруг оси Z.Это означает, что
slices
должно быть не менее 3, потому что для создания фигуры необходимо минимум 3 точки вокруг диска.например.
gluDisk(quadrica, 0.0, 5.0, 3, 1);
сгенерируют треугольник, а
gluDisk(quadrica, 0.0, 5.0, 5, 1);
сгенерируют пятиугольник.
Если вы запустите это в отладчике и установите точку останова на erro
, вы найдете что-то вроде этого (вывод из GDB):
Breakpoint 1, erro (coderro=100901) at test.c:12
12 estring=gluErrorString(coderro);
(gdb) bt
#0 erro (coderro=100901) at test.c:12
#1 0xf7dd7782 in gluQuadricError (qobj=0x81ddb70, which=100901) at src/libutil/quad.c:81
#2 0xf7dd85ad in gluPartialDisk (qobj=0x81ddb70, innerRadius=0, outerRadius=5, slices=1, loops=1, startAngle=0, sweepAngle=360) at src/libutil/quad.c:450
#3 0xf7dd84c8 in gluDisk (qobj=0x81ddb70, innerRadius=0, outerRadius=5, slices=1, loops=1) at src/libutil/quad.c:427
#4 0x08048af2 in tela () at test.c:36
#5 0xf7f72da8 in fghRedrawWindow () from /usr/lib/libglut.so.3
#6 0xf7f72df3 in fghcbDisplayWindow () from /usr/lib/libglut.so.3
#7 0xf7f77a90 in fgEnumWindows () from /usr/lib/libglut.so.3
#8 0xf7f72e47 in fghDisplayAll () from /usr/lib/libglut.so.3
#9 0xf7f73f39 in glutMainLoopEvent () from /usr/lib/libglut.so.3
#10 0xf7f73f97 in glutMainLoop () from /usr/lib/libglut.so.3
#11 0x08048b52 in main (argc=1, argv=0xffffd4e4) at test.c:48
Итак, ошибка исходит от gluDisk
, Теперь простая попытка поиграть с его параметрами позволяет мне догадаться, что виновником является slices=1
, что действительно не имеет смысла. Установка его, например, 2
избегает попадания в обратный вызов ошибки.