2016-04-26 7 views
0

Ich habe eine Basis abstrakte Controller-Klasse, die eine generische Funktionalität enthält. Ich habe auch eine Reihe von Unterklassen. Die abstrakte Klasse hat eine Eigenschaft, die ich Dependency injizieren möchte. Diese Eigenschaft ist allen Unterklassen gemeinsam, daher möchte ich nicht, dass sie auf alle Unterklassen gesetzt wird. Aber wenn ich die Funktion des abstrakten Controllers in der Unterklasse anrufe, stellt sich heraus, dass die Eigenschaft im abstrakten Controller null ist. Ich will wissen, warum und wie sie zu beheben it.Below ist der Code-Schnipsel:
Abstract Controller:Dependancy Injection in abstrakten Controller fehlgeschlagen

@Controller 
public abstract class WebAPIBaseController { 
    @Resource 
    private IPermissionService permissionService; 

    public void validPermission(int user,String code){ 
     permissionService.valid(user,code); 
    } 
} 

SubController

@Controller 
@RequestMapping("/order") 
public class OrderController extends WebAPIBaseController { 

    public String XXX(){ 
    validPermission(1,"code");//it will throw a NullPointerException 
} 
} 

außerdem, wenn ich abstrakte Controller entfernen (wie unten Beispiel), es funktioniert gut.
Remove abstract controller

@Controller 
@RequestMapping("/order") 
public class OrderController{ 
    @Resource 
    private IPermissionService permissionService; 

    public void validPermission(int user,String code){ 
     permissionService.valid(user,code); 
    } 
    public String XXX(){ 
    validPermission(1,"code");//it works good 
    } 
} 
+0

Ihr Code, auch wenn einige Syntaxfehler gibt, funktioniert, wie es die Injektion des Dienstes in Bezug auf. Es gibt mir kein Problem. Zeigen Sie den Code Ihrem Dienst, weil das vielleicht das Problem ist. – dambros

+0

Tatsächlich erhalte ich per SOA permissionService, genau wie 'permissionService = ClientUtils.getClient (IPermissionService.class);' im abstrakten Controller. Der permissionService ist gut, denn wenn ich permissionService in subController direkt bekomme, funktioniert es gut. –

+0

Wirklich schwer zu sagen, da es hier gut funktioniert. Wie nennt man 'XXX()'? – dambros

Antwort

0

glaube ich nicht, dass Sie die permissionService in der Unterklasse injizieren müssen, dies zu tun, dass die Oberklasse verbergen.

+0

Am ersten zwei Code-Snippet, injiziere ich nicht PermissionService in der Unterklasse und es wirft Nullpointer Ausnahme. –

0

Sie könnten @Autowired über die Unterklasse Konstruktor verwenden:

public abstract class WebAPIBaseController { 

    private final IPermissionService permissionService; 

    public WebAPIBaseController(IPermissionService permissionService) { 
    this.permissionService = permissionService; 
    } 

    public void validPermission(int user, String code){ 
    permissionService.valid(user,code); 
    } 

} 

@Controller 
@RequestMapping("/order") 
public class OrderController extends WebAPIBaseController { 

    @Autowired 
    public OrderController(IPermissionService permissionService) { 
    super(permissionService); 
    } 

    public String XXX(){ 
    validPermission(1,"code");//it will throw a NullPointerException 
    } 

} 
Verwandte Themen