Игнорировать поля JSON для запроса POST, но не следует игнорировать для запроса GET - PullRequest
0 голосов
/ 19 февраля 2019

Я новичок в среде Spring Boot.У меня есть модель, как показано ниже:

   public  class Process{
   private String processId;
   private ProcessStatus status;
   private hostname;
   private errorMessage;
}

Опубликовать вызовы с контроллера:

@RequestMapping(value = "/process", method = RequestMethod.POST,
                    consumes = { MediaType.APPLICATION_JSON_UTF8_VALUE })
    public HttpStatus updateProcess (@RequestBody Process process)
    {
        try {
            processService.updateProcess(process);
            return HttpStatus.OK;
        } catch (Exception e) 
            throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR,e,
                e);
        }
    }

Получить вызов для процесса:

@RequestMapping(value = "/process", method = RequestMethod.GET,
                    produces = { MediaType.APPLICATION_JSON_UTF8_VALUE })
    public Process getProcess (@RequestParam("processId") String processId)
    {
        try {
            return processService.getProcess(processId);
        } catch (Exception e) {
            throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR,
                e);
        } 
    }

Итак, сообщение находится в процессевыполняется компонентом A, который отвечает за обновление информации о процессе.Компонент-B выполняет Get для получения существующего процесса.Вопрос: Как я могу скрыть имя хоста и сообщение об ошибке для получения, а не для поста.Когда я делаю @JsonIgnore вне курса, он игнорирует оба запроса.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Вы можете использовать функцию JsonView.Вы можете определить несколько разных уровней:

public class Views {
    public static class Public {
    }

    public static class Internal extends Public {
    }
}

Теперь вам нужно аннотировать свои POJO атрибуты:

public class Process{
   @JsonView(Views.Public.class)
   private String processId;

   @JsonView(Views.Public.class)
   private ProcessStatus status;

   @JsonView(Views.Internal.class)
   private String hostname;

   @JsonView(Views.Internal.class)
   private String errorMessage;
}

Если у вас уже есть это, вам нужно аннотировать API методы,GET:

@RequestMapping(value = "/process", method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_UTF8_VALUE })
@JsonView(Views.Public.class)
public Process getProcess (@RequestParam("processId") String processId)

А для POST:

@RequestMapping(value = "/process", method = RequestMethod.POST, consumes = { MediaType.APPLICATION_JSON_UTF8_VALUE })
@JsonView(Views.Internal.class)
public HttpStatus updateProcess (@RequestBody Process process)

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

0 голосов
/ 19 февраля 2019

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

public class ProcessDTO {
   private String processId;
   private ProcessStatus status;
   private hostname;
}

Кроме того, это означает создание сопоставления между Process и ProcessDTO, что можно сделатьвручную или может быть сделано с помощью какой-либо библиотеки, например org.modelmapper .

Предполагая, что Process является неким классом сущностей, в действительности не рекомендуется использовать в любом случаеих напрямую отправлять обратно данные JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...