2017-04-10 4 views
0

Ich erstelle eine Webanwendung mit Spring MVC, die JSON-Anforderungen mithilfe von @ RequestBody/Jackson in POJOs analysiert.Statische Methode für den Zugriff auf DAO zulassen

Wenn Jackson ein POJO erstellt, kann ich meinen DAO-Dienst nicht automatisch aktivieren, stattdessen habe ich eine Möglichkeit geschaffen, statisch über eine Hilfsmethode auf das DAO zuzugreifen.

private static DAOService daoService; 

public static User getUserById(int id) 
{ 
    return daoService.getUserDao().getById(id); 
} 

Ich habe Spring den DaoService beim Start der Anwendung, die nur ein Halter für meine DAOs ist.

Ich mache dies, weil meine Entitäten, die Jackson erstellt, andere untergeordnete Entitäten aus der Datenbank abrufen müssen, um sich selbst zu vervollständigen.

Dies scheint zu arbeiten, aber ich bin besorgt, ob das sicher ist oder nicht. Kann irgendjemand irgendwelche Probleme damit vorhersehen?

Ich gehe davon aus, dass es sicher ist, da DaoService nie mutiert ist und die getById-Methode nur auf ihren eigenen Argumenten handelt.

Dank

Edit:

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

Was ist mit gleichzeitigen Zugriff auf die untergeordneten Einheiten? – efekctive

+0

@efekctive Würden sie nicht getrennte Instanzen sein? – FMC

+0

Wenn Sie mit der statischen Methode Nr. Auf die untergeordneten Entitäten zugreifen. – efekctive

Antwort

0

Sie Vorschlag ist gültig und sicher.

Wenn Sie den Prozess der Deserialisierung sauber halten möchten, können Sie einen Konverter von Jackson erstellen, der von Long in Bean konvertiert werden kann. Es erfordert ein wenig Klempner, aber es kann sich lohnen es:

zuerst Ihr Feld mit einem benutzerdefinierten Konverter mit Anmerkungen versehen:

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

definieren dann den Konverter mit dem SlotDao mit @Autowired kommentiert. Der Wandler wandelt von Long zu Slot:

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

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

Schließlich hat Jackson mit einem benutzerdefinierten Spring instanciator konfiguriert werden. So SlotConverter wird von Spring instanziiert und konfiguriert werden:

ObjectMapper mapper = new ObjectMapper(); 
mapper.setConfig(mapper.getDeserializationConfig().with(new SpringHandlerInstantiator(applicationContext.getAutowireCapableBeanFactory()))); 

Der folgende Code Foo mit der Slot-ID deserialisiert wird:

Foo foo = mapper.readValue("{\"slot\":10}", Foo.class); 

Hoffe, es hilft!

Verwandte Themen