如何动态实现 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 还解释了如何解决该限制。