问题描述
我正在尝试将主体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中进行。