【问题标题】:How to @autowire some bean into JsonSerializer?如何@autowire 一些 bean 进入 JsonSerializer?
【发布时间】:2013-07-10 16:31:45
【问题描述】:

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

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

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

}

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

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

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

【问题讨论】:

  • 如果DesignSerializer用@Component标记,如果我没记错的话,它应该是一个bean。你能抢到spring创造的bean吗?
  • 怎么样?这个序列化器在使用@ResponseBody 完成控制器后被spring调用
  • 你没有一个Application Context 可以在上面使用getBean 吗?
  • 没有。它的弹簧MVC。并且所有内容都有注释
  • 抱歉是我误读了您的评论。

标签: java spring spring-mvc jackson


【解决方案1】:

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

public class DesignSerializer extends JsonSerializer<Design> {

    @Autowired
        IDesignService designService;
    }

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

...

}

希望对你有帮助

【讨论】:

  • 太棒了。与网络上的其他建议相比如此简单。
  • +1 用于 SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);它也解决了我的问题。
  • 你能告诉我如何在杰克逊的情况下使用自动接线吗? stackoverflow.com/questions/35436279/…
  • 如果您使用带有@Qualifier 的特定bean 是否有效?
  • @JosselinePerdomo 是的,确实如此
【解决方案2】:

我们在使用 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(..));
    }
}

【讨论】:

  • 不知何故我不喜欢这个解决方案,但我不知道如何以更好的方式做到这一点。所以我按照这种方式:-)
【解决方案3】:

我通过在不同的 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;
}}

如本帖所示:Can you use @Autowired with static fields?

【讨论】:

    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 2019-02-25
    • 2018-09-22
    相关资源
    最近更新 更多