2017-08-16 1 views
0

Prenez la classe abstraite générale suivante:@Configurable ne fonctionne pas sur la sous-catégorie

@Configurable 
    public abstract class TestEntityRoot { 
    public abstract String print(); 
} 

Et une sous-classe:

@Configurable 
public class TestEntity extends TestEntityRoot{ 

    private TestEntityService testEntityService; 

    @Autowired 
    public void setTestEntityService(TestEntityService testEntityService) { 
     this.testEntityService = testEntityService; 
    } 

    @Override 
    public String print() { 
     return testEntityService.print(); 
    } 
} 

Lorsque le contrôleur d'appel:

@RestController 
public class TestEntityController { 

    @GetMapping(name = "/test") 
    public String print() { 
     TestEntity entity = new TestEntity(); 
     return entity.print(); 
    } 
} 

tout va bien. Mais si appeler comme ceci:

@RestController 
public class TestEntityController { 

    @GetMapping(name = "/test") 
    public String print() { 
     TestEntityRoot entity = new TestEntity(); 
     return entity.print(); 
    } 
} 

Je reçois un pointeur nul. Est-il possible que le deuxième exemple de travail?

+0

Vous ne pouvez pas créer de beans Spring avec caling 'new' sur le bean. Le printemps a besoin de le traiter, d'injecter des haricots. Aussi, je vois un autre problème - Ne pas injecter des services dans les entités - c'est faux. Les entités ne devraient pas avoir de logique. – Gondy

Répondre

1

Dans le second cas, vous créez manuellement la classe plutôt que d'utiliser le haricot de printemps. Autowire le haricot à la place. Voir

@RestController 
public class TestEntityController { 
    @Autowired 
    private TestEntity entity 
    @GetMapping(name = "/test") 
    public String print() { 
     return entity.print(); 
    } 
} 
+0

Merci pour votre réponse. Mais le polimorphisme était l'idée principale. Je peux avoir une variété de sous-classes de TestEntityRoot avec une implimintation différente de la méthode print(). Je voudrais l'appeler par type TestEntityRoot. Mais je ne peux pas l'atteindre dans AspectJ, et je ne suis même pas sûr que ce soit réalisable au printemps. Peut être qu'il y a un moyen qui peut être fait cependant. – GoodYar

+0

Utilisez la même approche. Autowire le TestEntityRoot à la place. – StanislavL