Пружинная загрузка с Джерси - Свойства тела запроса фильтра - PullRequest
0 голосов
/ 28 мая 2019

Хотелось бы узнать, есть ли способ отфильтровать свойства объекта, который получает ресурс.

Позвольте мне объяснить: скажем, у нас есть этот объект:

UserDTO

public final class IniciativaDocument {
    private String id;
    private String name;
    private String surname;
    private String address;
    private Double balance;
}

А для ресурса мне нужны только свойства "name" и "фамилия", а для других мне нужны только "address" и "id". Есть ли способ автоматически обнулить ненужные переменные чем-то вроде Джексона?

Моя цель для этого состоит в том, чтобы, если клиент отправлял запрос с полем, которое не нужно, мне не приходилось обнулять его перед сохранением в базе данных, поскольку это поле не должно инициализироваться при регистрации.

Спасибо.

РЕДАКТИРОВАТЬ 1

Для большей ясности: это из соображений безопасности и простоты.

Представьте, что я хакер и каким-то образом знаю поля, которые есть у DTO класса. Я мог бы легко отправить запрос POST, подобный этому, в службу регистрации пользователей:

{
   "id": "wrong",
   "name": "Wrong",
   "balance": 20000
}

Для моего обслуживания мне понадобятся только id и name, но хакер также отправляет поле balance.

Что я хочу сделать, так это то, что при получении этого объекта я могу установить свою конечную точку /api/v1/users (которая должна регистрироваться), чтобы поместить любое инициализированное поле, которое не является id или name в null .

Вы могли бы сказать, что я могу просто убедиться, что это 0 или установить его на ноль вручную. Да, это правда, но я хочу выяснить, есть ли автоматический и более удобный способ сделать это с аннотациями или чем-то подобным.

РЕДАКТИРОВАТЬ 2

Пример ресурса:

@Component
@Path("iniciativas")
@Produces(MediaType.APPLICATION_JSON)
public final class IniciativasEndpoint {
    @POST
    public Response crearIniciativa(@Valid @NotNull(message = CONSTRAINT_BODY_NOT_NULL) @ConvertGroup(to = IniciativasGroup.Create.class)
                                        final IniciativaDTO iniciativaDTO,
                                    @Context UriInfo uriInfo) {

        return Response.ok().build();
    }
}

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Используйте фильтр пост-соответствия: Вы можете реализовать ContainerRequestFilter и аннотировать ваш фильтр с помощью @PostMaching (javax.ws.rs.container.PreMatching) и манипулировать вашим запросом с его данными там.

Определите @interface для вашего фильтра:

@NameBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface AnnotationForYourFilter {}

Аннотируйте нужный подресурс с помощью @AnnotationForYourFilter, и все готово.

0 голосов
/ 28 мая 2019

Вы можете использовать Jackson's JsonIgnore Property для этого, например:

@JsonInclude(Include.NON_NULL)
public final class IniciativaDocument {
    private String id;
    private String name;
    private String surname;
    private String address;
}

Итак, в основном, когда он отображает этот класс на Json, он игнорирует все поля со значением null.И если вы хотите, чтобы он не применялся ко всему классу, вы можете сделать это и для полей.

И если вы хотите достичь этого через front-end, тогда вы можете использовать этот замечательный API GraphQL , поэтому в основном в запросе вы указываете, какие поля вам нужны, и он будет возвращать только эти поля.

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