2017-04-10 158 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); 

希望它能幫助!