如何@autowire一些bean到JsonSerializer中?

问题描述 投票:0回答:4

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

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

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

}

这是完全可以理解的,因为

DesignSerializer
正在使用每个对象的“new”运算符进行实例化。

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

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

java spring spring-mvc jackson
4个回答
34
投票

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

public class DesignSerializer extends JsonSerializer<Design> {

    @Autowired
        IDesignService designService;
    }

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

...

}

希望对你有帮助


23
投票

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

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 与静态字段一起使用吗?


1
投票

如果您使用 Spring Boot,

@JsonComponent
将为您进行自动装配。

@JsonComponent
public class DesignSerializer extends JsonSerializer<Design> {
    @Autowired
    private DesignService designService;
}

可以在自动配置 json 支持的同时测试此序列化器。

@AutoConfigureJson
@SpringBootTest
class DesignSerializerTest {

    @Autowired
    private ObjectMapper objectMapper;
    
    @Test
    void testDesignSerializer() {
        objectMapper.writer().writeValueAsString(new Design());
    }
}    
© www.soinside.com 2019 - 2024. All rights reserved.