【问题标题】:How to implement Jackson custom serialization outside a domain bean?如何在域 bean 之外实现 Jackson 自定义序列化?
【发布时间】:2014-01-17 22:17:30
【问题描述】:

我有一个 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 中发送到前端。所以,我的解决方案是双重的:

  1. 首先,我需要在 bean 中添加一个“虚拟”Json 属性...我可以在 bean 中使用 @JsonProperty 对方法执行此操作...

    @JsonProperty("validActions")
    public String writeValidActions {
         return "placeHolderForSerializerToChange";
    }
    
  2. ...但它只是生成一个占位符。要真正生成有效值, 我需要引用会话的安全角色, 我非常不愿意在上述方法中编码。 (一个服务电话在 域 bean 本身?似乎非常错误。)我 认为我应该创建一个自定义序列化程序并放置逻辑 - 和参考 到那里的 Session.Security 角色。我的直觉是对的,不是 将会话信息注入域 bean 方法?如果是这样,那会是什么
    自定义序列化器是什么样子的?

【问题讨论】:

    标签: java dojo jackson dgrid java-custom-serialization


    【解决方案1】:

    是的,我不会将会话信息放入域中,也不会直接在我的域中访问会话。

    除非有特定原因,否则您可以简单地将逻辑添加到您的操作类中。

    public String clickDisplayFoos(){
        List<Foo> foos =  service.getFoos();
        for(iterate through foos){
            foo.setValidAction(session.hasSecurityRole())
        }
        String json = objMapper.writeValueAsString(foobeans);
        return json;
    }
    

    我不喜欢在序列化过程中设置新值的想法。我觉得自定义序列化程序旨在转换特定属性的表示,而不是向属性添加新值。

    【讨论】:

    • 我同意您对域 bean Sashi 中的“虚拟”Json 属性的不适。我看到除了对象关系阻抗不匹配之外,域对象-UI 对象阻抗不匹配......或类似的东西。是时候访问 Java 博客来讨论这些想法了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多