如何在外部控制器的控制器内运行方法

时间:2013-10-01 10:35:10

标签: java spring spring-mvc

我有一个控制器类:

@Controller
public class MyController {

@AutoWired
Service myservice

@RenderMapping
public display(){
    //do work with myservice
}

}

我想从外部类调用方法display(),但我是一个空指针异常。

以下是我从外部类调用display方法的方法:

new MyController.display()

但实例myservice被设置为null。

如何调用MyController.display()并确保myservice的实例未设置为null?

我认为问题是因为我正在创建一个新的控制器实例,然后服务没有自动装配?但是,由于Spring控制器是单例,也许我可以访问控制器的当前实例?

更新:

我尝试这个的原因是我正在添加一个配置选项来确定应该实现哪种控制器显示方法。也许我应该使用超级控制器来确定应该实现哪个控制器?

2 个答案:

答案 0 :(得分:1)

这个想法是:使用抽象的父类!

// this class has no mapping
public abstract class MyAbstractController() {
  @Autowired
  MyService service

  public String _display(Model model, ...) {
    // here is the implementation of display with all necessary parameters
    if(determine(..)){...}
    else {...}
  }

  // this determines the behavior of sub class
  public abstract boolean determin(...);
}

@Controller
@RequestMapping(...)
public class MyController1 extends MyAbstractController {

  @RequestMapping("context/mapping1")
  public String display(Model model, ...) {
    // you just pass all necessary parameters to super class, it will process them and give you the view back.
    return super._display(model, ...);
  }

  @Override
  public boolean determine(...) {
  // your logic for this 
  }
}

@Controller
@RequestMapping(...)
public class MyController2 extends MyAbstractController {

  @RequestMapping("context/mapping2")
  public String display(Model model, ...) {
    // you just pass all necessary parameters to super class, it will process them and give you the view back.
    return super._display(model, ...);
  }

  @Override
  public boolean determine(...) {
  // your logic for this 
  }
}

希望这可以帮助你...

答案 1 :(得分:0)

  

我认为问题是因为我正在创建一个新的实例   控制器服务然后没有自动装配?

是。您可以在Spring中使用BeanFactory API访问您的bean。但直接调用控制器听起来很可疑。你能告诉我们你想要达到的目标吗?我们可以看看是否有一种标准的方法可以做到这一点?