Добавить свойство объекта в RestEasy InputStream containerRequestContext

#java #spring-boot #resteasy

#java #весенняя загрузка #resteasy

Вопрос:

Я пытаюсь добавить основной идентификатор к каждому входящему запросу как часть тела. Это код, который я использую:

         InputStream in = containerRequestContext.getEntityStream();
        String jsonRequestString = IOUtils.toString(in, encoding);

        ObjectMapper mapper = new ObjectMapper();
        JsonFactory factory = mapper.getFactory();
        JsonParser parser = factory.createParser(jsonRequestString);
        JsonNode jsonNode = mapper.readTree(parser);

        ((ObjectNode) jsonNode).put(PRINCIPAL_ID, containerRequestContext.getSecurityContext().getUserPrincipal().getName());

        containerRequestContext
                .setEntityStream(IOUtils.toInputStream(mapper.writeValueAsString(jsonNode), encoding));
  

Это мой ресурс:

 @POST
@Path("/service")
@RolesAllowed(USER_ROLE)
@Produces(MediaType.APPLICATION_JSON)
public Response myService(String principalId, String input){
    // do stuff
}
  

Когда запрос попадает на ресурс, я вижу, что новая строка json привязывается к аргументу principalId, например

 principalId = {"principalId": "id", "input":"input"}
  

есть ли способ привязать каждое свойство к соответствующему аргументу?

Ответ №1:

Здесь у вас есть два варианта:

  • напишите перехватчик (например, с AspectJ), который обрабатывает все ваши конечные точки и заполняет principalId параметр вашего метода или POJO.
  • напишите фильтр сервлета. Эта опция требуется для чтения одного и того же запроса дважды. Первое чтение произойдет в фильтре при последующей предварительной обработке, а второе — в Spring servlet.