Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java类调用控制器方法_Java_Spring Mvc - Fatal编程技术网

从java类调用控制器方法

从java类调用控制器方法,java,spring-mvc,Java,Spring Mvc,以下是我的控制器及其方法 I just want to know whether controller class method is accessible from another java class. 我只想从另一个java类调用这个控制器方法。 我怎样才能让它工作? 请建议……简短回答:是的,这是可能的。在其他类/线程中,您可以 @Controller public class TestResultUploadController { @RequestMapping(m

以下是我的控制器及其方法

I just want to know whether controller class method is accessible from another java class.    
我只想从另一个java类调用这个控制器方法。 我怎样才能让它工作?
请建议……

简短回答:是的,这是可能的。在其他类/线程中,您可以

@Controller
public class TestResultUploadController {
    @RequestMapping(method = RequestMethod.POST,value="/uploadTestResult")  
    public @ResponseBody  
     String uploadTestResult(String testResultBarcode,int deviceLoc) {

         //some code goes here
    return something;
}
但是请记住,您的设置非常不寻常,所有自动连接字段都无法正确连接。如果从上下文获取控制器,则可以正确连接/注入字段:

// this will create a new instance of that controller where no fields are wired/injected
TestResultUploadController controller = new TestResultUploadController();
controller.uploadTestResult("someString", 1234); 
或者,您可以在其他课程中:

// obtain controller bean from context, should have fields wired properly
TestResultUploadController controller = ctx.getBean(TestResultUploadController.class);
controller.uploadTestResult("someString", 1234); 
同样,这是非常不寻常的,但很有可能。然而,仅仅因为某些事情是可能的,并不意味着你应该去做。我建议使用更常见的Spring/MVC方法,将业务逻辑外包给服务。基本上,有这样的东西:

@Autowired private TestResultUploadController controller;

....
public void doStuff(){
    controller.uploadTestResult("someString", 1234); 
}
在你的帖子里:

@Controller
public class TestResultUploadController {

    @Autowired private UploadTestResultService uploadTestResultService;

    @RequestMapping(method = RequestMethod.POST,value="/uploadTestResult")  
    public @ResponseBody String uploadTestResult(String testResultBarcode,int deviceLoc) {
        return uploadTestResultService.uploadTestResult(testResultBarcode, deviceLoc);
    }
}
这样,您就可以在控制器的测试中模拟UploadTestResultService,并且还可以在不在控制器中的情况下单独测试该服务的uploadTestResult方法

编辑:
如何获得Spring上下文超出了这个问题的范围。我假设您了解基本的Spring和基本的java。

如果必须这样做,我认为您有一个设计问题。也许您应该将该方法移动到较低级别,以便其他控制器可以访问。仅供参考。我可以通过创建controllers对象并直接调用该方法来调用该方法。但在这种情况下,@Autowired字段不会被初始化。我知道设计是错误的,但流必须是这样的,因为我试图从在上下文初始化时初始化的线程调用此方法。@swapnillwalivkar您可以实现此流,而不必有错误的设置。你可以把这个方法放在一个服务中,让控制器和你的线程各自调用这个服务,而不是违反mvc原则。你只想调用是什么意思?你在考虑服务吗?我想是的。如果你能进一步指出,我可以提供具体的答案,我有一个线程类在后台运行。我试图从线程类调用控制器类方法(但@autowired给了我null)。我尝试通过new关键字创建对象,但在DAO层的末尾,EntityManager变为null。这就是我试图从控制器本身发出请求的原因。我尝试了所有的解决方案,但都不起作用。autowiring在服务层给了我空实例。你能在ctx.GetBean上给出规范吗?你做了正确的组件扫描吗?您是否将服务声明为bean或组件?春天的时候你好像是新来的。这完全取决于项目的设置方式。试着让自动连线工作,如果你做不到,就在某处创建一个静态方法并调用它而不是服务:我正在尝试让自动连线工作。我有一些疑问,解释一下你有什么疑问。在我看来,你似乎不能完全理解春天是如何运作的。您设法自动连接了控制器中的字段,为什么不能自动连接服务中的字段?我的建议是,在开始认真编写代码之前,先学习一门基本的春季速成课程。
//somehow get the service
UploadTestResultService uploadTestResultService = //somehowGetTheService (whether from context or in some other way)
uploadTestResultService.uploadTestResult(testResultBarcode, deviceLoc);