2017-04-10 120 views
0

我正在使用Spring MVC构建一个Web应用程序,该应用程序使用@ RequestBody/Jackson将JSON请求分析为POJO。允许静态方法访问DAO

当Jackson创建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

并发访问子实体呢? – efekctive

+0

@efekctive他们不会是单独的实例吗? – FMC

+0

如果使用静态方法编号访问子实体。 – efekctive

回答

0

您的建议是有效和安全的。

如果你想保持你的bean清理的反序列化过程,你可以创建一个Jackson转换器,将Long转换为你的Bean。它需要一点点的水暖工,但它可能值得的:

先给相应的字段的自定义转换器:

public class Foo { 
    @JsonDeserialize(converter = SlotConverter.class) 
    public void setSlot(Slot slot) { 
     this.slot = slot; 
    } 
} 

然后用@Autowired注释的SlotDao定义转换器。该转换器转换从LongSlot

public class SlotConverter extends StdConverter<Long, Slot> { 
    @Autowired 
    private SlotDao slotDao;   

    @Override 
    public Slot convert(Long id) { 
     return slotDao.getSlotById(id); 
    } 
} 

最后,杰克逊已经与定制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); 

希望它能帮助!