How to @autowire some bean into JsonSerializer?

后端 未结 3 1128
孤街浪徒
孤街浪徒 2020-12-08 07:22

I am using lazy loading with hibernate in my web app.

I would like to load some objects from the database at the parsing stage of the server response

相关标签:
3条回答
  • 2020-12-08 08:05

    We had the same problem with JsonSerializer and Spring autowiring. The solution that worked for us was to make two constructors. One for Spring which sets the dependency as a static field, and another one that is used by the Jackson initialisation.

    This works because the Spring dependency injection (autowiring) happens before Jackson initialises the serializer.

    @Component
    public class MyCustomSerializer extends JsonSerializer<String> {
    
        private static IDesignService designService;
    
        // Required by Jackson annotation to instantiate the serializer
        public MyCustomSerializer() { }
    
        @Autowired
        public MyCustomSerializer(IDesignService designService) {
            this.designService = designService;
        }
    
        @Override
        public void serialize(String m, JsonGenerator gen, SerializerProvider s) {
            gen.writeObject(MyCustomSerializer.designService.method(..));
        }
    }
    
    0 讨论(0)
  • 2020-12-08 08:10

    Solution is SpringBeanAutowiringSupport if you are using Spring Framework 2.5+.

    public class DesignSerializer extends JsonSerializer<Design> {
    
        @Autowired
            IDesignService designService;
        }
    
        public DesignSerializer(){
            SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);    
        }
    
    ...
    
    }
    

    I Hope that help you

    0 讨论(0)
  • 2020-12-08 08:17

    I Solved the problem by creating a static field in a different bean and then @Autowire its setter method.

    @Service("ToolBox")
    @Transactional
    public class ToolBox 
    {
    static Logger logger = Logger.getLogger(ToolBox.class);
    
    
    private static IService service;
    
    
    @Autowired
    public void setService(IService service)
    {
        ToolBox.service = service;
    }
    
    public static IService getService()
    {
        return ToolBox.service;
    }}
    

    like shown in this thread: Can you use @Autowired with static fields?

    0 讨论(0)
提交回复
热议问题