2013-12-04 4 views
5
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; 
} 

Я просто хочу назвать этот метод контроллера другим классом Java. Как я могу заставить его работать? предложите ..

+0

сделать способ статическим? – aardvark

+0

Если вам нужно это сделать, я думаю, что у вас проблемы с дизайном. возможно, вам следует перевести метод на более низкий уровень, чтобы быть доступным другим контроллерам. – TheEwook

+0

FYI. Я могу вызвать этот метод, создав объект контроллеров и напрямую вызвав этот метод. но в этом случае @Полученные поля не будут инициализированы. Я знаю, что дизайн неправильный, но поток должен быть таким образом, потому что я пытаюсь вызвать этот метод из потока, который инициализируется во время инициализации контекста. –

ответ

1

Короткий ответ: да, это возможно. В вашей другой класс/нить, вы можете сделать

// this will create a new instance of that controller where no fields are wired/injected 
TestResultUploadController controller = new TestResultUploadController(); 
controller.uploadTestResult("someString", 1234); 

Однако, имейте в виду, что ваша установка является весьма необычным, и все ваши autowired поля не будет подключен правильно. Если вы получаете ваш контроллер от контекста, вы бы быть в состоянии иметь свои поля Проводная/впрыскивается правильно:

// obtain controller bean from context, should have fields wired properly 
TestResultUploadController controller = ctx.getBean(TestResultUploadController.class); 
controller.uploadTestResult("someString", 1234); 

или вы можете в вашем другом классе, есть:

@Autowired private TestResultUploadController controller; 

.... 
public void doStuff(){ 
    controller.uploadTestResult("someString", 1234); 
} 

Опять же, это очень необычно, но очень возможно. Однако, просто заставить что-то сделать, не означает, что вы должны это делать. Я бы рекомендовал более общий подход Spring/MVC, в котором вы передаете бизнес-логику в Службу. В принципе, есть что-то вроде этого:

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

И в вашей теме:

//somehow get the service 
UploadTestResultService uploadTestResultService = //somehowGetTheService (whether from context or in some other way) 
uploadTestResultService.uploadTestResult(testResultBarcode, deviceLoc); 

Таким образом, вы бы иметь возможность дразнить UploadTestResultService в тестах контроллера, и вы также сможет самостоятельно протестировать метод uploadTestResult для этой службы, не входя в контроллер.

EDIT: Как получить контекст Spring вне сферы действия этого вопроса. Я предполагаю, что вы знаете основную весну, а также базовую java.

+0

Я пробовал все ваши решения, но не работал. autowiring дает мне нулевой экземпляр в слое сервиса. –

+0

может у вас указать спецификации на ctx.getBean –

+0

Вы выполняете правильное сканирование компонентов? Вы объявляете свои услуги в виде компонентов или компонентов? Вы, кажется, новичок на весне. Все зависит от того, как настроен ваш проект. Попытайтесь получить autowiring, чтобы работать, и если вы не можете этого сделать, просто создайте статический метод где-нибудь и вызовите его вместо службы: https://gist.github.com/anonymous/4d072f266ae1bb7bc457 –

Смежные вопросы