现在有个需求需要先请求 A 接口,再拿 A 接口的结果请求 B 接口
A 接口的结果和 B 接口的请求体实际上是一样的,但是 json 序列化的方式不同
A 接口 {name:'xxx',code:'xxx'....}
B 接口 {BB_name:'xxx',BB_code:''}
如果现在想声明一个类来同时充当这 2 个接口的请求和响应,怎么在拿到 A 的结果直接把 bean 给 B,B 通过方法上的注解或者什么其他手段在发送 B 接口的时候,将 requestBody 的 json field 自动拼上 BB_前缀
用 map 梭哈的话 replace 一下 key 名就好,但是后续应该还会有类似的接口,就想能不能写点什么工具
用 @JsonSerialize
好像会改变整个类的,在方法参数上用好像不生效
现在是写了注解在方法参数里,定义了前缀和后缀 . methodB(@Anno(prefix="BB_")@RequestBody Obj obj)
RequestBodyAdvice
,在 afterBodyRead()
里面直接改 body 的值,然后 return 后报错了. 现在在看 HandlerMethodArgumentResolver
,在想 resolveArgument()
里面应该怎么改.菜鸡一个,也不知道思路对不对,请大佬们指点一下.
1
wleexi 2023-03-02 23:06:37 +08:00
org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor
看下这个 |
2
brust 2023-03-02 23:11:45 +08:00
自定义两个 bean 感觉好点,然后 mapstruct 转一下
|
3
Amber2011 OP |
4
litchinn 2023-03-03 09:39:16 +08:00
|
5
bk201 2023-03-03 10:23:56 +08:00
这个不就是 json 序列化改造一下就行了吗? jsonalias 之类的
|
6
wleexi 2023-03-03 10:32:38 +08:00
对, 实现这个接口就可以了。
|
7
wleexi 2023-03-03 10:32:55 +08:00
@Override
public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception { // TODO 可通过客户端的传递的请求头来切换不同的响应体的内容 mavContainer.setRequestHandled(true); // returnValue = POJO ApiResponse apiResponse = ApiResponse.ok(returnValue); HttpServletResponse response = (HttpServletResponse) webRequest.getNativeResponse(); response.addHeader("v", "3"); ServletServerHttpResponse httpOutMessage = createOutputMessage(webRequest); converter.write(apiResponse, MediaType.APPLICATION_JSON, httpOutMessage); } |
8
Aresxue 2023-03-03 12:05:52 +08:00
写一个 XxxBeanSerializerModifier 继承 com.fasterxml.jackson.databind.ser.BeanSerializerModifier 获取注解做修改
修改 spring mvc 序列化的 objectMapper 对象,objectMapper.setSerializerFactory(objectMapper.getSerializerFactory() .withSerializerModifier(new XxxBeanSerializerModifier())); |