我有一个 Spring 托管 bean...
@Component("Foobean")
@Scope("prototype")
public class foobean {
private String bar1;
private String bar2;
public String getBar1() {
return bar1;
}
public void setBar1(String bar1) {
this.bar1 = bar1;
}
public String getBar2() {
return bar2;
}
public void setBar2(String bar2) {
this.bar2 = bar2;
}
}
...并且因为我使用 Dojo Dgrid 来显示此 bean 的 ArrayList,所以我将其作为 JSON 字符串返回到 Controller 中:
@Controller
@RequestMapping("/bo")
public class FooController {
@Autowired
private FooService fooService
@RequestMapping("action=getListOfFoos*")
@ResponseBody
public String clickDisplayFoos(
Map<String, Object> model) {
List<Foobean> foobeans = fooService.getFoobeans();
ObjectMapper objMapper = new ObjectMapper();
String FooJson = null;
try {
FooJson = objMapper.writeValueAsString(foobeans);
} catch (JsonGenerationException e) {
etc.
}
但是,我的网格需要一个附加列,其中包含每个 Foo 的有效操作;该操作并不真正依赖于各个 Foos 中的任何数据 - 它们都将具有相同的有效操作 - 在生成的 DGrid 的每一行上重复 - 但该值实际上取决于 session 上的安全角色... 不能以Json形式发送到前端。所以,我的解决方案有两个:
首先,我需要向 bean 添加一个“虚拟”Json 属性...我可以在 bean 中使用方法上的 @JsonProperty 来执行此操作...
@JsonProperty("validActions") public String writeValidActions { return "placeHolderForSerializerToChange"; }
...但它只是生成一个占位符。要真正生成有效值, 我需要引用 session 的安全角色, 我非常不愿意用上面的方法编写代码。 (服务电话 域 bean 本身?看起来非常错误。)我 我认为我应该创建一个自定义序列化器并放置逻辑和引用 到那里的 Session.Security 角色。我的直觉是否正确,不 将 session 信息注入(inject)到域 bean 方法中?如果是这样,这样的情况会怎样
自定义序列化器是什么样的?
最佳答案
是的,我不会将 session 信息放入域中或直接在我的域中访问 session 。
除非有特定原因,否则您可以简单地将逻辑添加到操作类中。
public String clickDisplayFoos(){
List<Foo> foos = service.getFoos();
for(iterate through foos){
foo.setValidAction(session.hasSecurityRole())
}
String json = objMapper.writeValueAsString(foobeans);
return json;
}
我不喜欢在序列化过程中设置新值的想法。我认为自定义序列化器旨在转换特定属性的表示,而不是向属性添加新值。
关于java - 如何在域 bean 之外实现 Jackson 自定义序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21197000/