我正在使用Spring MVC构建一个Web应用程序,它使用@RequestBody / Jackson将JSON请求解析为POJO。
当杰克逊创建POJO时,我无法自动装配我的DAO服务,所以我创建了一种通过实用方法静态访问DAO的方法。
private static DAOService daoService;
public static User getUserById(int id)
{
return daoService.getUserDao().getById(id);
}
我在应用程序启动时填充了daoService,这只是我的DAO的持有者。
我这样做是因为杰克逊创建的实体需要从数据库中检索其他子实体才能完成自己。
这似乎有效,但我担心这是否安全。任何人都可以预见到这个问题吗?
我认为它是安全的,因为daoService永远不会发生变异,而getById方法只对其自己的参数起作用。
由于
编辑:
public void setSlot(int id) {
this.slot = EntityUtils.getSlotById(id);
}
答案 0 :(得分:0)
您的提案有效且安全。
如果您希望保持bean清除反序列化过程,您可以创建一个Jackson转换器,以便从Long
转换为Bean
。它需要一点水管工,但它可能值得:
首先使用自定义转换器注释您的字段:
public class Foo {
@JsonDeserialize(converter = SlotConverter.class)
public void setSlot(Slot slot) {
this.slot = slot;
}
}
然后使用SlotDao
注释@Autowired
来定义转换器。转换器从Long
转换为Slot
:
public class SlotConverter extends StdConverter<Long, Slot> {
@Autowired
private SlotDao slotDao;
@Override
public Slot convert(Long id) {
return slotDao.getSlotById(id);
}
}
最后,必须使用自定义Spring instanciator配置jackson。因此,SlotConverter
将由Spring实例化和配置:
ObjectMapper mapper = new ObjectMapper();
mapper.setConfig(mapper.getDeserializationConfig().with(new SpringHandlerInstantiator(applicationContext.getAutowireCapableBeanFactory())));
以下代码将使用插槽ID反序列化Foo
:
Foo foo = mapper.readValue("{\"slot\":10}", Foo.class);
希望它有所帮助!