将对象属性附加到RestEasy InputStream containerRequestContext

问题描述

我正在尝试将主体ID作为正文的一部分添加到每个传入请求中。这是我正在使用的代码

        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"}

是否可以将每个属性绑定到各自的参数?

解决方法

您在这里有两个选择:

  • 编写拦截器(例如,使用AspectJ),该拦截器处理所有端点并将{ "errorType": "InvalidParameter","errorMessage": "Invalid parameter: TopicArn","code": "InvalidParameter","message": "Invalid parameter: TopicArn","time": "2020-10-08T00:00:21.546Z","requestId": "cb65c64a-fac3-50f7-abb5-91b2a216f3c1","statusCode": 400,"retryable": false,"retryDelay": 20.211126070388417,"stack": [ "InvalidParameter: Invalid parameter: TopicArn"," at Request.extractError (/var/task/node_modules/aws-sdk/lib/protocol/query.js:50:29)"," at Request.callListeners (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:106:20)"," at Request.emit (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:78:10)"," at Request.emit (/var/task/node_modules/aws-sdk/lib/request.js:683:14)"," at Request.transition (/var/task/node_modules/aws-sdk/lib/request.js:22:10)"," at AcceptorStateMachine.runTo (/var/task/node_modules/aws-sdk/lib/state_machine.js:14:12)"," at /var/task/node_modules/aws-sdk/lib/state_machine.js:26:10"," at Request.<anonymous> (/var/task/node_modules/aws-sdk/lib/request.js:38:9)"," at Request.<anonymous> (/var/task/node_modules/aws-sdk/lib/request.js:685:12)"," at Request.callListeners (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:116:18)"," at Request.<anonymous> (/var/task/node_modules/aws-sdk/lib/request.js:38:9)" ] } 填充到方法的参数或POJO。
  • 写一个servlet filter。需要此选项才能读取两次相同的请求。第一次读取将在过滤器中进行以下预处理,而第二次读取将在Spring servlet中进行。