V2EX › Java
Spring 有什么方式可以在不同方法中更改 @RequestResponseBody 中同一个 entity 的序列化方式
By Amber2011 at 2023 年 3 月 2 日 · 2343 次点击现在有个需求需要先请求 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()里面应该怎么改.
- 但是后续不太会操作了.先是写了个自定义的
菜鸡一个,也不知道思路对不对,请大佬们指点一下.
8 条回复 • 2023-03-03 12:05:52 +08:00
|
1
wleexi 2023 年 3 月 2 日
org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor
看下这个 |
|
2
brust 2023 年 3 月 2 日
自定义两个 bean 感觉好点,然后 mapstruct 转一下
|
|
3
Amber2011 OP |
|
4
litchinn 2023 年 3 月 3 日
|
|
5
bk201 2023 年 3 月 3 日
这个不就是 json 序列化改造一下就行了吗? jsonalias 之类的
|
|
6
wleexi 2023 年 3 月 3 日
对, 实现这个接口就可以了。
|
|
7
wleexi 2023 年 3 月 3 日
@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 年 3 月 3 日
写一个 XxxBeanSerializerModifier 继承 com.fasterxml.jackson.databind.ser.BeanSerializerModifier 获取注解做修改
修改 spring mvc 序列化的 objectMapper 对象,objectMapper.setSerializerFactory(objectMapper.getSerializerFactory() .withSerializerModifier(new XxxBeanSerializerModifier())); |