我有一个 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
@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 的每一行上重复——但该值实际上取决于会话中的安全角色......不能在 Json 中发送到前端。所以,我的解决方案是双重的:
首先,我需要在 bean 中添加一个“虚拟”Json 属性...我可以在 bean 中使用 @JsonProperty 在方法上执行此操作...
@JsonProperty("validActions") public String writeValidActions { return "placeHolderForSerializerToChange"; }
...但它只是生成一个占位符。要真正生成一个有效的值,我需要引用会话的安全角色,我非常不愿意在上面的方法中编码。(域 bean 本身中的服务调用?似乎非常错误。)我认为我应该创建一个自定义序列化程序并将逻辑 - 以及对 Session.Security 角色的引用放在那里。我的直觉是否正确,不要将会话信息注入域 bean 方法?如果是这样,这样的
自定义序列化程序会是什么样子?