Java 允许静态方法访问DAO
我正在使用SpringMVC构建一个web应用程序,它使用@RequestBody/Jackson将JSON请求解析为POJO 当Jackson创建POJO时,我无法自动连接我的DAO服务,因此我创建了一种通过实用方法静态访问DAO的方法Java 允许静态方法访问DAO,java,spring,hibernate,spring-mvc,Java,Spring,Hibernate,Spring Mvc,我正在使用SpringMVC构建一个web应用程序,它使用@RequestBody/Jackson将JSON请求解析为POJO 当Jackson创建POJO时,我无法自动连接我的DAO服务,因此我创建了一种通过实用方法静态访问DAO的方法 private static DAOService daoService; public static User getUserById(int id) { return daoService.getUserDao().getById(id); } 我
private static DAOService daoService;
public static User getUserById(int id)
{
return daoService.getUserDao().getById(id);
}
我让spring在应用程序启动时填充daoService,它只是我DAO的一个持有者
我这样做是因为Jackson创建的实体需要从数据库中检索其他子实体来完成自身
这似乎有效,但我担心这是否安全。有人能预见到这方面的任何问题吗
我假设它是安全的,因为daoService从未发生过变异,getById方法只对自己的参数起作用
谢谢
编辑:
你的建议是有效和安全的 如果您希望保持bean的反序列化过程干净,您可以创建一个Jackson转换器,将
Long
转换为bean
。这需要一点管道工,但可能值得:
首先使用自定义转换器对字段进行注释:
public class Foo {
@JsonDeserialize(converter = SlotConverter.class)
public void setSlot(Slot slot) {
this.slot = slot;
}
}
然后,使用带有@Autowired
注释的SlotDao
定义转换器。转换器从Long
转换为Slot
:
public class SlotConverter extends StdConverter<Long, Slot> {
@Autowired
private SlotDao slotDao;
@Override
public Slot convert(Long id) {
return slotDao.getSlotById(id);
}
}
以下代码将使用插槽id反序列化Foo
:
Foo foo = mapper.readValue("{\"slot\":10}", Foo.class);
希望有帮助 如何并发访问子实体?@efekctive它们不是单独的实例吗?如果使用静态方法访问子实体,则@efekctive静态方法返回子实体的新实例,静态方法本身不会修改它。这些子实体是否来自数据库?如果是这样,一个请求可以在前一个请求的鼻子下修改数据。如果数据发生更改,则实例是否为新实例并不重要
ObjectMapper mapper = new ObjectMapper();
mapper.setConfig(mapper.getDeserializationConfig().with(new SpringHandlerInstantiator(applicationContext.getAutowireCapableBeanFactory())));
Foo foo = mapper.readValue("{\"slot\":10}", Foo.class);