2 votes

@Autowired créer un objet nul malgré la @configuration

J'ai la classe de configuration suivante

@org.springframework.context.annotation.Configuration
public class TemplateConfiguration {

    @Bean
    public Configuration configuration() {
        Configuration configuration = new Configuration(new Version(2, 3, 23));
        configuration.setClassForTemplateLoading(TemplateConfiguration.class, "/templates/");
        configuration.setDefaultEncoding("UTF-8");
        configuration.setLocale(Locale.US);
        configuration.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
        return configuration;
    }
}

et je l'utilise au @service suivant

@Service
public class FreeMarkerService {

    @Autowired
    private Configuration configuration;

    private static final Logger logger = LoggerFactory.getLogger(FreeMarkerService.class);

    public String process() {
        try {
            Template template = configuration.getTemplate("someName");
            ....
        } catch (IOException | TemplateException e) {
            logger.error("Error while processing FreeMarker template: " + e);
            throw new RuntimeException(e);
        }
    }
}

mais quand j'essaie d'appeler process() comme

FreeMarkerService f = new FreeMarkerService()
f.process() 

J'obtiens une exception car l'objet de configuration est nul.

Je veux créer une instance en utilisant les annotations @Autowired et @Configuration. qu'est-ce que je fais de mal ?

5voto

lzagkaretos Points 2055

Vous devez utiliser l'instanciation de Spring FreeMarkerService en évitant l'utilisation de new pour les objets tels que les contrôleurs ou les services.

Par exemple,

@Service
public class SampleService {

    @Autowired
    private FreeMarkerService freeMarkerService;

    public String callProcess() {
        return freeMarkerService.process();
    }
}

Vous trouverez plus de détails dans de nombreux articles comme ce .

2voto

Raymond Stanley Points 51

Il s'agit d'une injection de membre :

@Autowired
private static Configuration configuration;

Ce que fait Spring après avoir instancié le bean à partir de son constructeur. Donc au moment où vous faites cet appel de méthode statique, Spring n'a pas injecté la valeur.

1voto

Plog Points 5142

C'est parce que vous essayez de câbler automatiquement un champ statique. Ceci n'est pas possible dans Spring. Retirez static de votre propriété Configuration et cela devrait fonctionner.

@Autowired
private Configuration configuration;

1voto

 @Autowired
 private static Configuration configuration;

Pourquoi autowired un champ statique ? Voici la raison. Le membre statique se charge en même temps que la définition de la classe, donc il ne reçoit pas la valeur injectée et reçoit la valeur par défaut qui est nulle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X