Java EE 7 — использование @DELETE или @PUT с телом объекта

У меня есть сервисный метод, который выглядит так

public void deleteData(Data data) {
    this.dataDao.deleteData(data);
}

В классе данных есть несколько полей. Что-то вроде этого

private String name;
private String category;
private String discriminator;
private String description;
private String appName;

// getters & setters

Мне нужно написать метод отдыха для этого. Я думал написать что-то вроде этого

@DELETE
@Path("/deleteData")
public Response deleteData(Data data) {
    // implementation
}

Проблема в том, что использование @DELETE с телом объекта не рекомендуется или широко используется.

Мой вопрос: можно ли использовать @PUT вместо @DELETE? Я не могу изменить реализацию метода службы, так что это не вариант. Какая следующая лучшая альтернатива здесь?

ОБНОВИТЬ

В методе dataDao.deleteData() поиск объекта не осуществляется по идентификатору объекта. Это выглядит примерно так:

DataEntity entity = this.findDataByNameAndAppName(data.getName(), data.getAppName());

Я решил сделать что-то вроде этого:

@DELETE
@Path("/deleteDataset")
public Response deleteDataset(@QueryParam("name") String name,
                              @QueryParam("appName") String appName) {
// implementation...
}

Однако я не нашел ни одного примера метода @DELETE с @QueryParam. Во всех примерах вместо этого использовалось @PathParam.

Как видно по реализации сервиса, он мне нужен! - ок, надо, а другие варианты не пробовали? Например, просто получить идентификатор ресурса и передать его сервису, обернув его в ваш объект data? Вам не нужно держать свои контроллеры с той же подписью, что и у вашего сервиса, поскольку вы можете получать любую информацию, обертывать, обрабатывать, форматировать, проверять, а затем использовать ее так, как вам нужно.
nullptr 26.03.2019 16:47

Я бы сказал, что использование @DELETE — лучший вариант, поскольку он соответствует спецификации HTTP. Вы можете просто лучше подумать о том, как вы можете интегрировать этот уровень с вашим устаревшим сервисом. Хорошим подходом было бы изменить ваш URI на /delete/{dataId}, а затем правильно обработать его на уровне вашего контроллера (например, создать новый объект Data, устанавливающий идентификатор)

nullptr 26.03.2019 16:50

Я обычно использую метод post для этих целей.

Roman C 26.03.2019 17:42

Я видел много стандартных клиентов REST, позволяющих пользователям иметь тело запроса для операции DELETE. Поэтому я думаю, что вполне нормально использовать тело запроса для операции DELETE, проверьте этот пост: stackoverflow.com/questions/299628/…

Amit 26.03.2019 17:42

@Amit Jersey, упомянутый в тегах, не разрешает тело для запросов DELETE.

devmind 27.03.2019 14:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
468
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ну, DELETE предназначен для... удаление материала. Так что придерживайтесь этого (без тела).

Вы можете либо удалить ресурс, используя его уникальный идентификатор, отправленный в качестве параметра пути:

DELETE /resources/{id} HTTP/1.1
Host: example.org

Если вам нужно удалить несколько ресурсов, вы можете рассмотреть параметры запроса для фильтрации набора ресурсов, а затем удалить ресурсы, соответствующие таким критериям:

DELETE /resources?name=foo&category=bar HTTP/1.1
Host: example.org

Интересно, является ли использование @QueryParam таким же нестандартным, как и предоставление тела сущности?

gozluklu_marti 27.03.2019 14:28

@Yonetmen URI — это идентификатор ресурса, и ничто не мешает вам выполнить запрос DELETE к URI со строкой запроса.

cassiomolin 27.03.2019 14:46

Другие вопросы по теме