Printemps io @Autocâblés: Le vide final de champ peut ne pas avoir été initialisé
ce que je suppose est une jolie question fondamentale ici-
Il y a plusieurs types de questions concernant cette erreur, mais aucun dans les 5 premiers résultats qui ont ajouté la nuance de Printemps.
J'ai un début de REST-ful webapp écrite au printemps. Je suis en train de le connecter à une base de données.
J'ai une entité du nom de l'espace de travail et essaie de l'utiliser au printemps injection d'un haricot( terminologie correcte ?) pour enregistrer une instance de l'espace de travail de l'entité
package com.parrit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.parrit.models.Workspace;
import com.parrit.models.WorkspaceRepository;
@RestController
@RequestMapping("/workspace")
public class WorkspaceController {
@Autowired
private final WorkspaceRepository repository;
@RequestMapping(method = RequestMethod.POST)
void save( @RequestBody String workspaceHTML) {
Workspace ws = new Workspace();
ws.setHTML(workspaceHTML);
repository.save(ws);
}
}
Mon erreur est sur le référentiel variable private final WorkspaceRepository repository
. Le compilateur se plaint qu'il ne peut pas être initialisé et de tenter d'exécuter l'application, vous obtiendrez le même résultat.
Comment puis-je obtenir une instance de cet objet de référentiel dans mon contrôleur afin de faire enregistrer les opérations sur elle?
OriginalL'auteur Pinwheeler | 2016-01-03
Vous devez vous connecter pour publier un commentaire.
Avoir
@Autowired
et finale sur un champ sont contradictoires.Le dernier dit: cette variable a une et une seule valeur, et c'est initialisée au moment de la construction.
L'ancien dit: le Printemps va construire l'objet, en laissant ce champ comme null (valeur par défaut). Puis le Printemps va utiliser la réflexion pour initialiser ce domaine avec un bean de type WorkspaceRepository.
Si vous voulez finale champs autocâblés, l'utilisation du constructeur d'injection, tout comme vous le feriez si vous ne l'injection par vous-même:
OriginalL'auteur JB Nizet
Exactement, vous devez fournir un constructeur qui affecte le champ final
Et le Printemps sera en mesure de comprendre comment initialiser l'objet et injecter le référentiel via le constructeur
OriginalL'auteur Sleiman Jneidi