有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java允许静态方法访问DAO

我正在使用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方法只对自己的参数起作用

谢谢

编辑:

    public void setSlot(int id) {
        this.slot = EntityUtils.getSlotById(id);
   }

共 (1) 个答案

  1. # 1 楼答案

    你的建议是有效和安全的

    如果您想让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);
        }
    }
    

    最后,jackson必须配置一个定制的Spring instanciator。因此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);
    

    希望有帮助