我知道可以用注释控制器方法@JsonView(...)
在 Spring MVC 中静态定义单个视图类。不幸的是,这意味着我可能拥有的每种类型的视图都需要不同的端点。
我看到其他人也问过这个问题before https://stackoverflow.com/questions/23665107/select-jsonview-in-the-spring-mvc-controller。虽然这种方法可能有效,但 Spring 通常有多种方法可以完成同一件事。有时,如果您对某些内部结构有一些了解,解决方案可能会比最初看起来要简单得多。
我想要一个控制器端点,它可以根据当前主体动态选择适当的视图。我可以退货吗Model
具有包含适当视图类或可能的属性MappingJacksonValue
直接实例化?
我看到在org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter#writeInternal
有一段代码决定使用哪个视图:
if (value instanceof MappingJacksonValue) {
MappingJacksonValue container = (MappingJacksonValue) object;
value = container.getValue();
serializationView = container.getSerializationView();
}
这似乎来自org.springframework.web.servlet.mvc.method.annotation.JsonViewResponseBodyAdvice#beforeBodyWriteInternal
但我无法确定是否有一种方法可以绕过这个问题,只需返回一个包含必要信息的特定值Jackson2HttpMessageConverter
选择正确的视图。
非常感谢任何帮助。
万一其他人也想实现同样的目标,其实很简单。
可以直接返回一个org.springframework.http.converter.json.MappingJacksonValue
来自控制器的实例,其中包含要序列化的对象和视图类。
这将由org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter#writeInternal
将使用方法和适当的视图。
它的工作原理是这样的:
@RequestMapping(value = "/accounts/{id}", method = GET, produces = APPLICATION_JSON_VALUE)
public MappingJacksonValue getAccount(@PathVariable("id") String accountId, @AuthenticationPrincipal User user) {
final Account account = accountService.get(accountId);
final MappingJacksonValue result = new MappingJacksonValue(account);
final Class<? extends View> view = accountPermissionsService.getViewForUser(user);
result.setSerializationView(view);
return result;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)