反序列化后有没有办法在承包商之后调用方法

Posted

技术标签:

【中文标题】反序列化后有没有办法在承包商之后调用方法【英文标题】:Is there a way to call method after contractor after deserializion 【发布时间】:2020-01-05 07:15:48 【问题描述】:

我反序列化一个json,然后想在构造函数之后通过注解或其他方式调用postProcess方法?

json 文件:


  "type": "storeType",
  "name": "store-name",
  "list": [
    
      "type": "itemType",
      "name": "item1-name",
    ,
    
      "type": "itemType",
      "name": "item2-name",
    
  ]

Store.class:

 Store extends AbstractClass

    @Value("$store.size:100000")
    private Integer size;
    @Autowired
    private StorePersistency persistency;

    private String name;
    private List<abstractClass> list;

    public Store(@JsonProperty("name") String name, @JsonProperty("list") list) 
        this.name=name;
        this.list=list;
    

   @Override
   public postProcess()
     ...
   

Item.class:

 Item extends AbstractClass

    private String name;

    public Store(@JsonProperty("name") String name) 
        this.name=name;
    

   @Override
   public postProcess()
     ...
   

解串器服务:

AbstractClass clzz = objectMapper.readValue(jsonFile, AbstractClass.class)

目的是@authowire 和@value 其他类字段(StorePersistency 和大小)通过在 postProcess 方法中调用 authowireService。

授权服务:

public void authowireBean(Class clzz)
   applicationContext.getAutowireCapableBeanFactory().autowireBeanProperties(clzz, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);

【问题讨论】:

你应该为这样的类创建自己的 json 反序列化器,以摆脱它的所有其他 bean。 【参考方案1】:

您绝对应该将POJO 与持久层和服务层分离。对于持久层,您可以使用 DAO pattern 在您的情况下可能由 StorePersistency 类表示。您需要创建实现postProcess 的服务层。有关更多信息,请参阅Responsibilities and use of Service and DAO Layers。您的案例中的示例服务层可能如下所示:

@Component
class StoreService 

    @Value("$store.size:100000")
    private Integer size;

    @Autowired
    private StorePersistency persistency;

    public postProcess(Store store) 
       ...
    

【讨论】:

我需要在同一个 Store.class 中使用 StorePersistency 和 size 以及更多其他 bean(与 store 无关的),用于 json 反序列化。 @MariaDorohin,如果 bean 与 Store 类无关,则不应将它们注入 Store 类。可能您有一些操作要实施,这些操作对Store 执行某些操作。您可以实现Command Pattern 并创建许多CommandStore1CommandStore2 并在那里注入您需要的任何东西。

以上是关于反序列化后有没有办法在承包商之后调用方法的主要内容,如果未能解决你的问题,请参考以下文章

Protobuf .NET 后反序列化处理程序

有没有办法让 Spring Boot 反序列化以反序列化测试中的对象?

JAVA反序列化漏洞解决办法

xmldecoder反序列化漏洞分析

扩展方法对json序列化及反序列化

有没有办法注释 AutoBean 属性,使其不会被序列化/反序列化?