2017-08-16 63 views
0

看看下面的一般抽象類:@Configurable不工作的子類

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

而且一個子類:

@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(); 
    } 
} 

當呼叫控制器:

@RestController 
public class TestEntityController { 

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

一切就OK了。但如果這樣的電話:

@RestController 
public class TestEntityController { 

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

我得到空指針。第二個例子有可能工作嗎?

+0

您無法在bean上調用'new'來創建Spring Bean。 Spring需要處理它,以注入bean。另外我還看到另一個問題 - 不要將服務注入實體 - 這是錯誤的。實體不應該持有任何邏輯。 – Gondy

回答

1

在第二種情況下,您手動創建類而不是使用spring的bean。自動裝入該bean。請參閱

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

感謝您的回答。但是多晶現象是主要思想。我可以使用不同的方法print()的不同impindintation來使用TestEntityRoot的各種子類。我想通過鍵入TestEntityRoot來調用它。但在AspectJ中我無法實現它,我甚至不確定Spring是否可以實現。可能有一種方法可以做到。 – GoodYar

+0

使用相同的方法。自動調試TestEntityRoot。 – StanislavL