2012-10-08 4 views
0
내가 HttpInvokerServiceExporter + HttpInvokerProxyFactoryBean를 사용하려고 해요

,하지만 난 예외 얻는 무엇에 액세스 할 수 없습니다 : 단순 들어HttpInvokerServiceExporter + HttpInvokerProxyFactoryBean - HTTP 호출자 원격 서비스

org.springframework.remoting.RemoteAccessException: Could not access HTTP invoker remote service at [http://localhost:9999/testcaseapp/testcaseservice]; nested exception is java.io.IOException: Did not receive successful HTTP response: status code = 404, status message = [Not Found] 

를, 내가 테스트를 제작 한 케이스.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
public class RemoteTest { 

    private static final Logger logger = LoggerFactory.getLogger("TestsLogger"); 

    static interface TestCaseService { 
     public Integer add(Integer arg1, Integer arg2); 
    } 
    static class TestCaseServiceImpl implements TestCaseService { 
     public Integer add(Integer arg1, Integer arg2) { 
      return (arg1 != null ? arg1.intValue() : 0) + (arg2 != null ? arg2.intValue() : 0); 
     } 
    } 

    @Configuration 
    static class Config { 
     @Bean 
     public HttpInvokerServiceExporter httpInvokerServiceExporter() { 
      HttpInvokerServiceExporter httpInvokerServiceExporter = new HttpInvokerServiceExporter(); 
      httpInvokerServiceExporter.setService(new TestCaseServiceImpl()); 
      httpInvokerServiceExporter.setServiceInterface(TestCaseService.class); 
      return httpInvokerServiceExporter; 
     } 
     @Bean 
     public HttpInvokerProxyFactoryBean httpInvokerProxyFactoryBean() { 
      HttpInvokerProxyFactoryBean httpInvokerProxyFactoryBean = new HttpInvokerProxyFactoryBean(); 
      httpInvokerProxyFactoryBean.setServiceInterface(TestCaseService.class); 
      httpInvokerProxyFactoryBean.setServiceUrl("http://localhost:9999/testcaseapp/testcaseservice"); 
      httpInvokerProxyFactoryBean.afterPropertiesSet(); 
      return httpInvokerProxyFactoryBean; 
     } 
    } 

    @Autowired 
    private TestCaseService[] testCaseServices; 
    private static Server server; 

    @BeforeClass 
    public static void setUp() { 
     try { 
      server = new Server(); 
      SelectChannelConnector connector = new SelectChannelConnector(); 
      connector.setPort(9999); 
      server.addConnector(connector); 
      // 
      WebAppContext webAppContext = new WebAppContext(); 
      webAppContext.setContextPath("/testcaseapp"); 
      webAppContext.setWar("src/test/java/" + RemotingTest.class.getPackage().getName().replace('.', '/')); 
      server.setHandler(webAppContext); 
      // 
      server.start(); 
     } catch (Exception ex) { 
      logger.info("Could not permorm the set up: {}", ex.toString()); 
     } 
    } 

    @AfterClass 
    public static void destroy() { 
     try { 
      server.stop(); 
     } catch (Exception e) { 
     } 
    } 

    @Test 
    public void addTest() { 
     for (TestCaseService testCaseService : testCaseServices) { 
      Integer sum = testCaseService.add(10, 5); 
      Assert.assertNotNull(sum); 
      Assert.assertEquals(15, sum.intValue()); 
     } 
    } 

} 

나는 또한 TestCaseService 콩

@Bean public TestCaseService testCaseService() ... 

을 만들고 httpInvokerServiceExporter 인수

@Bean public HttpInvokerServiceExporter httpInvokerServiceExporter(TestCaseService testCaseService) 
... 
httpInvokerServiceExporter.setService(testCaseService); 

로 제공하기 위해 노력했지만 결과는 여전히 동일합니다.

내가 뭘 잘못하고 있니? 감사!

답변

2

저는 서블릿이 액세스 할 수 없다는 것이 문제라고 생각합니다.

서버 측

(메소드를 노출하는 응용 프로그램에 -SERVER-) 당신이 당신의 WEB-INF/web.xml 파일에 있는지 확인이 코드 : 여기

<web-app> 
... 
<servlet> 
    <servlet-name>remoting</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>remoting</servlet-name> 
    <url-pattern>/services/*</url-pattern> 
</servlet-mapping> 
... 
</web-app> 

을, 원격 메소드는 메소드를 호출 들면, "서비스"에서 제공하는 URL이 있어야한다 :

http://localhost:8080/sample/services/list 

그리고 당신은이 서블릿을 정의해야 accesible (WEB-INF/원격-servlet.xml 파일에서 내 경우) 빈을 만들어 :

<bean name="/list" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter"> 
    <property name="service" ref="myObjectQueryService" /> 
    <property name="serviceInterface" value="com.kategor.myapp.sample.service.ObjectQueryService" /> 
</bean> 

클라이언트 측

당신의 클라이언트에서 스프링을 사용하는 경우 (다른 예에서와 같이), 당신은 몇 가지 콩 (한 각 공용 자원), 원격 리소스에 액세스 정의 빈을 정의해야합니다 :이 경우

를, 그것은 다음과 같습니다

<bean id="listService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean"> 
    <property name="serviceUrl" value="http://localhost:8080/sample/services/list" /> 
    <property name="serviceInterface" value="com.kategor.myapp.sample.service.ObjectQueryService" /> 
</bean> 

귀하의 예가 옳습니다.

이 방법 서비스 "listService"를 호출, 당신은

@Controller 
public class HomeController { 

    // This is the remote service definition 
    @Autowired 
    private ObjectQueryService<MyObject, Long> objectQueryService; 

    /* .... */ 

    /** 
    * List all Objects retrieved through Web Service from a remote Server 
    */ 
    @RequestMapping(value = "listRemoteWS", method = RequestMethod.GET) 
    public String listRemoteWS(Locale locale, Model model) { 

     StringBuilder result = new StringBuilder(); 
     try { 

      // The Remote Service is called 
      List objs = objectQueryService.findAll(0, 10); 
      result.append(objs.size() + " objs found"); 

     for (MyObject o : objs) { 
      result.append("<br>* ").append(o.getId()).append(" = ").append(o.getName()); 
     } 


     } catch (Exception e) { 

      result.append("No objs have been found"); 
      e.printStackTrace(); 

     } 

     model.addAttribute("result", result); 

     return "index"; 
    } 

} 

가 그래서 문제가에서 오는 생각 클래스 com.kategor.myapp.sample.service.ObjectQueryService에서 사용할 수있는 모든 방법을 할 것이다 URL : 서비스가 표시되지 않거나 올바른 경로가 아닙니다.

자세한 내용은

이 링크를 (첫 번째는 정말 유용합니다) 확인 : http://www.ibm.com/developerworks/web/library/wa-spring3webserv/index.html

0

https://github.com/JamesEarlDouglas/barebones-spring-mvc/tree/master/reference/spring-remoting가 나에게 문제가 바람둥이가 동일한 응용 프로그램의 두 가지 버전을 포착했다. 이로 인해 클라이언트가 STS에서 디버그 모드로 실행될 때 위의 오류가 발생합니다. 해결책은 응용 프로그램에 대한 tomcat의 모든 확장 된 webapp 폴더를 정리하는 것입니다. 그런 다음 응용 프로그램을 다시 전개하십시오.