26

我在我的网络应用程序中使用延迟加载和休眠。

我想在服务器响应的解析阶段从数据库中加载一些对象

@Component
public class DesignSerializer extends JsonSerializer<Design> {
@Autowired
IDesignService designService; <-- is null

}

这是完全可以理解的,因为DesignSerializer每个对象都使用“新”运算符进行实例化。

我确信有一种方法可以将我的 bean 在创建时注入到该序列化程序中,我只是不知道如何。

你们能帮助我或指出我正确的方向吗?

4

3 回答 3

30

如果您使用的是 Spring Framework 2.5+,则解决方案是SpringBeanAutowiringSupport 。

public class DesignSerializer extends JsonSerializer<Design> {

    @Autowired
        IDesignService designService;
    }

    public DesignSerializer(){
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);    
    }

...

}

我希望对你有帮助

于 2014-02-04T20:41:21.083 回答
22

我们在使用 JsonSerializer 和 Spring 自动装配时遇到了同样的问题。对我们有用的解决方案是创建两个构造函数。一个用于将依赖项设置为静态字段的 Spring,另一个用于 Jackson 初始化。

这是因为 Spring 依赖注入(自动装配)发生在 Jackson 初始化序列化器之前。

@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(..));
    }
}
于 2014-07-03T11:05:59.480 回答
4

我通过在不同的 bean 中创建一个静态字段然后@Autowire它的 setter 方法解决了这个问题。

@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;
}}

就像这个线程中显示的那样:你可以将@Autowired 与静态字段一起使用吗?

于 2013-07-10T19:42:45.310 回答