如何动态实现 spring 的 ObjectMapper
How to dynamic ObjectMapper implementation for spring
客户端可以通过将其添加到api参数来决定PropertyNamingStrategy是SNAKE_CASE还是CAMEL_CASE。
我的想法是在进入controller之前做aop拦截器自定义ObjectMapper
我为 ObjectMapper 对象设置了 setPropertyNamingStrategy,但它只获得了第一个 PropertyNamingStrategy 集,没有使用第一次后设置的值。
@Aspect
@Component
@RequiredArgsConstructor
public class NamingJsonAspect {
private final ObjectMapper objectMapper;
@Pointcut("execution(public * com.nnv98..*Controller.*(..))")
private void namingJson() {}
@SneakyThrows
@Before("namingJson()")
public void doAround(JoinPoint proceedingJoinPoint) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
assert attributes != null;
HttpServletRequest request = attributes.getRequest();
String namingJson = request.getParameter("namingJson");
if(namingJson.equals("SNAKE_CASE")){
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
}else {
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
}
}
}
谢谢
您应该阅读 ObjectMapper 的 JavaDoc。
您看到的是预期行为,如 JavaDoc 中所述:配置只能在首次 read/write 使用之前完成。首次使用后,更改配置可能无效或可能导致错误。 JavaDoc 还解释了如何解决该限制。
客户端可以通过将其添加到api参数来决定PropertyNamingStrategy是SNAKE_CASE还是CAMEL_CASE。
我的想法是在进入controller之前做aop拦截器自定义ObjectMapper
我为 ObjectMapper 对象设置了 setPropertyNamingStrategy,但它只获得了第一个 PropertyNamingStrategy 集,没有使用第一次后设置的值。
@Aspect
@Component
@RequiredArgsConstructor
public class NamingJsonAspect {
private final ObjectMapper objectMapper;
@Pointcut("execution(public * com.nnv98..*Controller.*(..))")
private void namingJson() {}
@SneakyThrows
@Before("namingJson()")
public void doAround(JoinPoint proceedingJoinPoint) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
assert attributes != null;
HttpServletRequest request = attributes.getRequest();
String namingJson = request.getParameter("namingJson");
if(namingJson.equals("SNAKE_CASE")){
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
}else {
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
}
}
}
谢谢
您应该阅读 ObjectMapper 的 JavaDoc。
您看到的是预期行为,如 JavaDoc 中所述:配置只能在首次 read/write 使用之前完成。首次使用后,更改配置可能无效或可能导致错误。 JavaDoc 还解释了如何解决该限制。