Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 允许静态方法访问DAO_Java_Spring_Hibernate_Spring Mvc - Fatal编程技术网

Java 允许静态方法访问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); } 我

我正在使用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);
}
我让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);