我有一个Spring MVC项目。我写了类似
的代码@Controller
@RequestMapping("CallBack")
@WebService(name = "NotificationToCP", targetNamespace = "http://SubscriptionEngine.ibm.com")
public class CallbackController {
@RequestMapping("")
@ResponseBody
@WebMethod(action = "notificationToCP")
@RequestWrapper(localName = "notificationToCP", targetNamespace = "http://SubscriptionEngine.ibm.com", className = "in.co.mobiz.airtelVAS.model.NotificationToCP_Type")
@ResponseWrapper(localName = "notificationToCPResponse", targetNamespace = "http://SubscriptionEngine.ibm.com", className = "in.co.mobiz.airtelVAS.model.NotificationToCPResponse")
public NotificationToCPResponse index(
@WebParam(name = "notificationRespDTO", targetNamespace = "") CPNotificationRespDTO notificationRespDTO) {
return new NotificationToCPResponse();
}
}
我可以一起使用Spring MVC + Webservices吗?我想要的只是作为一个接受SOAP请求并处理它的控制器。网址需要/ CallBack。我仍然像新手一样迷茫。像上面的东西会工作。另外,我如何实现目标。
答案 0 :(得分:5)
我不会将Spring MVC和SOAP webservice(JAX-WS)混合在一起,因为它们用于不同的目的。
更好的做法是将业务操作封装在服务类中,并使用MVC控制器和JAX-WS公开它。例如:
HelloService的
@Service
public class HelloService {
public String sayHello() {
return "hello world";
}
}
HelloController具有通过自动装配注入的HelloService引用。这是标准的Spring MVC控制器,它调用服务并将结果作为模型传递给视图(例如:hello.jsp视图)
@Controller
@RequestMapping("/hello")
public class HelloController {
@Autowired private HelloService helloService;
@RequestMapping(method = RequestMethod.GET)
public String get(Model model) {
model.addAttribute("message", helloService.sayHello());
return "hello";
}
}
JAX-WS端点也调用相同的服务。不同之处在于服务作为SOAP Web服务公开
@WebService(serviceName="HelloService")
public class HelloServiceEndpoint {
@Autowired private HelloService helloService;
@WebMethod
public String sayHello() {
return helloService.sayHello();
}
}
请注意,上述JAX-WS样式的Web服务无法保证自动在所有Spring部署上运行,尤其是在非Java EE环境(tomcat)上部署时。可能需要进行其他设置。
答案 1 :(得分:0)
是的,您可能希望将Web服务端点添加到现有的Spring MVC应用程序中。问题是你可能需要为每个路径设置不同的路径,这很好。
您将需要两个servlet,一个用于处理HTTP / MVC的标准调度程序servlet和一个用于处理SOAP调用的MessageDispatcherServlet。
配置可能很棘手。首先要了解当你添加Spring-ws依赖项时,你将与Spring MVC有一个依赖项不匹配。您需要在pom中按如下方式排除Spring-web:
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>2.2.1.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</exclusion>
</exclusions>
</dependency>
一旦你完成了这项工作,你将需要添加两个servlet,一个用于通过Spring MVC处理Web请求,另一个用于处理SOAP。
我假设使用Spring 4进行no-xml配置,SpringBoot也是可行的。
以下是您将添加到网络初始值设定项的关键代码:
DispatcherServlet servlet = new DispatcherServlet();
// no explicit configuration reference here: everything is configured in the root container for simplicity
servlet.setContextConfigLocation("");
/* TMT From Java EE 6 API Docs:
* Registers the given servlet instance with this ServletContext under the given servletName.
* The registered servlet may be further configured via the returned ServletRegistration object.
*/
ServletRegistration.Dynamic appServlet = servletContext.addServlet("appServlet", servlet);
appServlet.setLoadOnStartup(1);
appServlet.setAsyncSupported(true);
Set<String> mappingConflicts = appServlet.addMapping("/web/*");
MessageDispatcherServlet mds = new MessageDispatcherServlet();
mds.setTransformWsdlLocations(true);
mds.setApplicationContext(context);
mds.setTransformWsdlLocations(true);
ServletRegistration.Dynamic mdsServlet = servletContext.addServlet("mdsServlet", mds);
mdsServlet.addMapping("/wsep/*");
mdsServlet.setLoadOnStartup(2);
mdsServlet.setAsyncSupported(true);
这就是它的全部内容。配置的其余部分是标准内容,可以在任何数量的示例中找到。
例如,您可以将Spring MVC和Spring-WS的弹簧IO示例轻松混合作为测试平台。只需确保相应地设置WebMvcConfigurerAdapter
和WsConfigurerAdapter
即可。它们将是两个单独的类,分别使用@Configuration @EnableWebMvc
和@EnableWs @Configuration
进行注释。必须使用@Endpoint
类将它们添加到组件扫描中。
使用浏览器编译,运行和测试根据上下文通过/web/*
的MVC内容和使用SoapUI的SOAP调用,方法是导入WSDL并从根目录中点击/wsep/*
。每个servlet处理的每个路径。