gpt4 book ai didi

java - Spring MVC : Appropriate extension point for wrapping API Responses

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:21:44 25 4
gpt4 key购买 nike

我有一个简单的 REST API,使用 Spring MVC @Controller@RequestMapping 构建。我想开始包装响应以提供额外的元数据。

例如,给定一个会返回的调用

HTTP GET: /users/1
{
"userName" : "Jack Jackerson"
}

我想把它包装起来,如下:

{
"metadata" :
{
"callLimit" : "50",
"callsRemaining" : "49"
},
"result" :
{
"userName" : "Jack Jackerson"
}
} ..etc..

此外,我想支持用于管理列表的标准参数集(limitoffset)。

因为这涉及到所有的 api 方法,我想将它实现为一些 spring 内部服务的装饰器,这样方法本身就可以专注于它们的实际逻辑,并使这些样板文件保持集中。

我已经开始着手装饰已注册的 HttpMessageConverter,并用装饰器包装它们。

但是,这并没有为我提供对未声明 @RequestBody 的方法的入站请求的访问权限。 (很多人没有)

理想情况下,我需要在堆栈中处于更高位置 - RequestResponseBodyMethodProcessor.writeWithMessageConverters() 看起来是个不错的候选者,但我不知道如何在这里 Hook 。

Spring MVC 可以使用哪些选项来实现这种类型的 API 级请求/响应处理?

最佳答案

这是我使用的实现:

public class MetadataInjectingReturnValueHandler implements HandlerMethodReturnValueHandler {

private final HandlerMethodReturnValueHandler delegate;

public MetadataInjectingReturnValueHandler(HandlerMethodReturnValueHandler delegate)
{
this.delegate = delegate;
}
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return delegate.supportsReturnType(returnType);
}

@Override
public void handleReturnValue(Object returnValue,
MethodParameter returnType, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest) throws Exception {
returnValue = wrapResult(returnValue); //Omitted
delegate.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
}
}



@Component
public class MetadataInjectionFactoryBean implements InitializingBean {

@Autowired
private RequestMappingHandlerAdapter adapter;
@Override
public void afterPropertiesSet() throws Exception {
HandlerMethodReturnValueHandlerComposite returnValueHandlers = adapter.getReturnValueHandlers();
List<HandlerMethodReturnValueHandler> handlers = Lists.newArrayList(returnValueHandlers.getHandlers());
decorateHandlers(handlers);
adapter.setReturnValueHandlers(handlers);
}
private void decorateHandlers(List<HandlerMethodReturnValueHandler> handlers) {
for (HandlerMethodReturnValueHandler handler : handlers) {
if (handler instanceof RequestResponseBodyMethodProcessor)
{
MetadataInjectingReturnValueHandler decorator = new MetadataInjectingReturnValueHandler(handler);
int index = handlers.indexOf(handler);
handlers.set(index, decorator);
log.info("Metadata Injecting decorator wired up");
break;
}
}
}

}

关于java - Spring MVC : Appropriate extension point for wrapping API Responses,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13173341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com