#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.