【问题标题】:Conditional @JsonView within controller method控制器方法中的条件@JsonView
【发布时间】:2021-08-27 14:47:45
【问题描述】:

我有一个用@JsonView 注释的控制器方法。当前的要求是,如果参数中给出的userId 与经过身份验证的用户匹配,则该方法使用不同的JsonView 返回响应。知道响应类型应保持ResponseEntity<MyObject> 且不应更改为MappingJacksonValue 或其他类型,如何实现这一点。

我正在使用 Spring,所以可能的一种方法是注入默认的 JacksonMapper 并根据方法中的条件更改其 SerializationView。但这里的问题是,注入什么以及如何实现这一点?

// Some controller annotations
@JsonView(Views.Public.class)
public static ResponseEntity<User> getUser(@PathVariable String userId)
    User user = userService.getUser(userId);
    User authenticated = userService.getAuthenticatedUser();
    if (userId.equals(authenticated.getId())) {
       // Change the view class to Views.Restricted.class
    }
    return new ResponseEntity<>(user, HttpStatus.OK);
}

【问题讨论】:

    标签: spring spring-boot jackson json-view get-mapping


    【解决方案1】:

    通过注入 spring 默认 ObjectMapper 并使用适当的 View 类更改其配置来解决它:

    @Autowired
    private ObjectMapper defaultMapper;
    //...
    public static ResponseEntity<User> getUser(@PathVariable String userId)
       User user = userService.getUser(userId);
       User authenticated = userService.getAuthenticatedUser();
       if (userId.equals(authenticated.getId())) {
          defaultMapper.setConfig(defaultMapper.getSerializationConfig().withView(Views.Restricted.class));
       } else {
          defaultMapper.setConfig(defaultMapper.getSerializationConfig().withView(Views.Public.class));
       }
       return new ResponseEntity<>(user, HttpStatus.OK);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 2017-11-09
      • 2014-01-11
      • 1970-01-01
      • 2014-11-29
      相关资源
      最近更新 更多