Как использовать запрос http patch при весенней загрузке? - PullRequest
0 голосов
/ 30 июня 2019

Я пытаюсь использовать запрос PATCH.

ниже код, который я использую. и это как лестница операторов if

@PatchMapping("/updateInvoiceByEmail/{email}")
    public Mono<ResponseEntity<Invoice>> updateInvoiceByEmail(
                @PathVariable String email,
                @RequestBody Invoice invoice) {

        return invoiceRepository
        .findByEmail(vendorEmail)

        .flatMap(existing -> {
            if (invoice.getInvoiceStatus() != null) {
                existing.setInvoiceStatus(invoice.getInvoiceStatus());
            }
            if (invoice.getCanRaise() != null) {
                existing.setCanRaise(invoice.getCanRaise());
            }
            if (invoice.getAttachmentId() != null) {
                existing.setAttachmentId(invoice.getAttachmentId());
            }
            if (invoice.getInvoiceId() != null) {
                existing.setInvoiceId(invoice.getInvoiceId());
            }
            ... and so on.
            return invoiceRepository.save(existing);

        })
        .map(updatedInvoice -> new ResponseEntity<>(updatedInvoice, HttpStatus.OK))
        .defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));

Я использую Spring WebFlux и mongodb

Как мне сделать короче и чище.

Спасибо

Ответы [ 2 ]

0 голосов
/ 30 июня 2019

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

Хорошее описание того, как вы используете UpdateDTO здесь

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

0 голосов
/ 30 июня 2019

Вы можете использовать отражение, если хотите уменьшить количество строк, хотя отражение всегда является последним, что вы должны сделать.Что бы я сделал, это переместил бы эту логику if - get - set в отдельный компонент (в отдельный класс или метод).Помимо этого, я просто хотел бы отметить, что простота не единственная проблема здесь.Предположим, что null является действительным значением, отправленным клиентом, вам понадобится некоторый механизм, чтобы определить, не отправлено ли значение или вы явно хотели установить значение null.Пример перемещения этого кода в отдельный компонент может выглядеть примерно так:

class InvoiceAssembler {
   public static assemble(Invoice existing, Invoice newInvoice) {
     if(newInvoice.getInvoiceId() != null) {
         existing.setInvoiceId(newInvoice.getInvoiceId());
     }
     ...
   }
} 
...