Restful API 同时使用CXF时变为404
Restful API becomes 404 when using the CXF at the same time
我有一个项目是用 Spring Boot 启动的。
它有一些 restful API 通过 Spring 集成入站网关。
之后,使用 CXF 将一些 web 服务端点添加到项目中。
当我设置 CXFServlet 映射时,所有 restful API 都变成了 404。
只有我暂停了 CXF 配置 restful API 再次可用。
请问在使用 CXF 的过程中,是否有任何东西阻止了 restful API 或 spring 集成入站网关?
CXFServlet 和总线
@Configuration
@ComponentScan("com.kennie")
@ImportResource("classpath:cxf-services.xml")
public class SimbaAdapterApplicationConfiguration {
@Bean
public ServletRegistrationBean dispatcherServlet() {
return new ServletRegistrationBean(new CXFServlet(), "/ws/*");
}
@Bean(name=Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
SpringBus bus = new SpringBus();
bus.getInInterceptors().add(new LoggingInInterceptor());
bus.getOutInterceptors().add(new LoggingOutInterceptor());
return bus;
}
XML配置
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<jaxws:server id="MyService" address="/ws/MyService"
serviceClass="com.kennie.IMyService" >
<jaxws:serviceBean>
<ref bean="myServiceImpl" />
</jaxws:serviceBean>
</jaxws:server>
服务接口
@WebService
public interface IMyService{
@WebMethod
public @WebResult(name = "Response") Response doRequest(
@WebParam(name = "Request", mode = WebParam.Mode.IN)
Request request
);
}
我不熟悉 CXF,但我知道 Spring 集成 HTTP 完全基于 Spring MVC。因此,如果您可以通过 CXF 配置 Spring MVC,那么所有这些 Spring 集成 HTTP 入站网关也将在那里可用。
我认为你的问题是在区分 Servlet 映射的地方。
看起来您的 REST API 是通过 CXF Servlet 路由的,但那个人不喜欢它,因此拒绝了。
当您将 CXF
添加到代码中时,所有 RESTful API 都将通过它进行路由。
我看到两个与您配置 CXF 的方式相互矛盾的设置 -
url-mapping
。您正在使用此代码注入 CXF:
@Bean
public ServletRegistrationBean dispatcherServlet() {
return new ServletRegistrationBean(new CXFServlet(), "/ws/*");
}
意思是 CXF 监听的 url 是 /ws/*
。
jax-ws
服务器!首先,您需要将其更改为 jax-rs
。 WS
用于 SOAP
。 RS
用于 Restful。您已将其地址定义为:
<jaxws:server id="MyService" address="/ws/MyService"
表示服务器正在侦听 /ws/MyService
CXF 和 jax-rs 服务器都在监听 ws/ something。现在,这不是真正的问题。你只需要将它添加到你正在点击的 URL 中,这样完整的 URL 就像这样:
http:<server>:<port>/<context-root>/<CXF Endpoint>/<jax-rs server address>/<REST API endpoint>
我猜您不希望 ws 在 URL 中出现两次。从 jax-rs
地址中删除它。
希望这对您有所帮助。
你可以为http rest多注册一个servletapi,此方法经测试OK:
@SpringBootApplication(
//scanBasePackages = {"com.huawei.manage"}
)
public class Application {
@Bean
public ServletRegistrationBean dispatcherServlet() {
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
applicationContext.scan("com.huawei.manage.hsf.controller");
DispatcherServlet rest_dispatcherServlet = new DispatcherServlet(applicationContext);
ServletRegistrationBean registrationBean = new ServletRegistrationBean(rest_dispatcherServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/*");
return registrationBean;
我有一个项目是用 Spring Boot 启动的。 它有一些 restful API 通过 Spring 集成入站网关。 之后,使用 CXF 将一些 web 服务端点添加到项目中。
当我设置 CXFServlet 映射时,所有 restful API 都变成了 404。
只有我暂停了 CXF 配置 restful API 再次可用。
请问在使用 CXF 的过程中,是否有任何东西阻止了 restful API 或 spring 集成入站网关?
CXFServlet 和总线
@Configuration
@ComponentScan("com.kennie")
@ImportResource("classpath:cxf-services.xml")
public class SimbaAdapterApplicationConfiguration {
@Bean
public ServletRegistrationBean dispatcherServlet() {
return new ServletRegistrationBean(new CXFServlet(), "/ws/*");
}
@Bean(name=Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
SpringBus bus = new SpringBus();
bus.getInInterceptors().add(new LoggingInInterceptor());
bus.getOutInterceptors().add(new LoggingOutInterceptor());
return bus;
}
XML配置
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<jaxws:server id="MyService" address="/ws/MyService"
serviceClass="com.kennie.IMyService" >
<jaxws:serviceBean>
<ref bean="myServiceImpl" />
</jaxws:serviceBean>
</jaxws:server>
服务接口
@WebService
public interface IMyService{
@WebMethod
public @WebResult(name = "Response") Response doRequest(
@WebParam(name = "Request", mode = WebParam.Mode.IN)
Request request
);
}
我不熟悉 CXF,但我知道 Spring 集成 HTTP 完全基于 Spring MVC。因此,如果您可以通过 CXF 配置 Spring MVC,那么所有这些 Spring 集成 HTTP 入站网关也将在那里可用。
我认为你的问题是在区分 Servlet 映射的地方。
看起来您的 REST API 是通过 CXF Servlet 路由的,但那个人不喜欢它,因此拒绝了。
当您将 CXF
添加到代码中时,所有 RESTful API 都将通过它进行路由。
我看到两个与您配置 CXF 的方式相互矛盾的设置 -
url-mapping
。您正在使用此代码注入 CXF:@Bean public ServletRegistrationBean dispatcherServlet() { return new ServletRegistrationBean(new CXFServlet(), "/ws/*"); }
意思是 CXF 监听的 url 是 /ws/*
。
jax-ws
服务器!首先,您需要将其更改为jax-rs
。WS
用于SOAP
。RS
用于 Restful。您已将其地址定义为:<jaxws:server id="MyService" address="/ws/MyService"
表示服务器正在侦听 /ws/MyService
CXF 和 jax-rs 服务器都在监听 ws/ something。现在,这不是真正的问题。你只需要将它添加到你正在点击的 URL 中,这样完整的 URL 就像这样:
http:<server>:<port>/<context-root>/<CXF Endpoint>/<jax-rs server address>/<REST API endpoint>
我猜您不希望 ws 在 URL 中出现两次。从 jax-rs
地址中删除它。
希望这对您有所帮助。
你可以为http rest多注册一个servletapi,此方法经测试OK:
@SpringBootApplication(
//scanBasePackages = {"com.huawei.manage"}
)
public class Application {
@Bean
public ServletRegistrationBean dispatcherServlet() {
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
applicationContext.scan("com.huawei.manage.hsf.controller");
DispatcherServlet rest_dispatcherServlet = new DispatcherServlet(applicationContext);
ServletRegistrationBean registrationBean = new ServletRegistrationBean(rest_dispatcherServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/*");
return registrationBean;