使用Spring在CXF中配置多个ResourceBean
我正在使用CXF RS 2.5.1和Spring 3.0.6版本。我希望“一个端点”有多个实现类。我看到这个问题已经报告并修复,但是,当我尝试这样做时,CXF只是从jaxrs:serviceBeans标记中选择第一个资源类。对于另一个请求,我在tomcat控制台上看到的消息是“找不到与请求路径/帐户/rest/传输匹配的操作”。下面是配置。感谢您的任何意见 web.xml使用Spring在CXF中配置多个ResourceBean,spring,class,cxf,Spring,Class,Cxf,我正在使用CXF RS 2.5.1和Spring 3.0.6版本。我希望“一个端点”有多个实现类。我看到这个问题已经报告并修复,但是,当我尝试这样做时,CXF只是从jaxrs:serviceBeans标记中选择第一个资源类。对于另一个请求,我在tomcat控制台上看到的消息是“找不到与请求路径/帐户/rest/传输匹配的操作”。下面是配置。感谢您的任何意见 web.xml <listener> <listener-class> org.spring
<listener>
<listener-class> org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:account-servlet.xml</param-value>
</context-param>
<servlet>
<servlet-name>CXF Servlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXF Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<jaxrs:server id="accountService" address="/rest">
<jaxrs:serviceBeans>
<ref bean="transferService" />
<ref bean="balanceService"/>
</jaxrs:serviceBeans>
<jaxrs:extensionMappings>
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
</jaxrs:server>
<bean id="transferService" class="com.mycompany.service.TransferService"/>
<bean id="balanceService" class="com.mycompany.service.BalanceService"/>
org.springframework.web.context.ContextLoaderListener
上下文配置位置
类路径:account-servlet.xml
cxfservlet
org.apache.cxf.transport.servlet.CXFServlet
cxfservlet
/*
账户servlet.xml
<listener>
<listener-class> org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:account-servlet.xml</param-value>
</context-param>
<servlet>
<servlet-name>CXF Servlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXF Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<jaxrs:server id="accountService" address="/rest">
<jaxrs:serviceBeans>
<ref bean="transferService" />
<ref bean="balanceService"/>
</jaxrs:serviceBeans>
<jaxrs:extensionMappings>
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
</jaxrs:server>
<bean id="transferService" class="com.mycompany.service.TransferService"/>
<bean id="balanceService" class="com.mycompany.service.BalanceService"/>
BalanceService.java(省略导入)
package com.mycompany.service;
@路径(“/”)
@生成(“应用程序/xml”)
公共类平衡服务{
@得到
@路径(“/余额”)
公共字符串getBalance(){
StringBuilder响应=新的StringBuilder(128);
答复。追加(“”)
附加(“”)附加(“”)250.00
.附加(“”);
返回response.toString();
}
}
TransferService.java(省略导入)
package com.mycompany.service;
@路径(“/”)
@生成(“应用程序/xml”)
公共类转移服务{
@得到
@路径(“/transfer”)
公共字符串getTransfer(){
StringBuilder响应=新的StringBuilder(128);
答复。追加(“”)
附加(“”)附加(“”)350.00
.附加(“”);
返回response.toString();
}
}
请忽略任何编程违规/标准,因为它只是POC的一个示例应用。因此我花了一些时间搜索互联网,但没有找到解决此问题的方法。文档中有一条注释可用于推断解决方案 因此,我编写了一个定制的资源比较器,并执行了相应的jaxrs:服务器配置和Eureka!成功了!。现在,我有两个实现类映射到javax:rs-address中的单个资源/地址 请注意,下面显示的自定义资源比较器中的逻辑可能因URL模式而异 提供所有文件的源代码。希望这对将来的人有所帮助:) web.xml 实现类/bean AccountService.java
您可能可以简化比较根资源的逻辑,例如,知道请求URI和根资源类的名称就足以做出决定,检查单个方法看起来很复杂。顺便说一句,只有当根资源和/或单个资源方法可以成为相等的候选者时,才需要自定义资源比较器我可以这样解决问题:
- 删除“自定义资源比较器”(无需)
- 删除此项:
<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-bundle-jaxrs</artifactId> <version>2.5.0</version> </dependency>
就这些。:) 我通过将@Path映射的一部分移动到服务bean类解决了这个问题。就你而言: 平衡服务
@Path("/balance")
@Produces("application/xml")
public class BalanceService {
@GET
@Path("/{id}")
public String getBalance(@PathParam("id") long id) {
...
}
}
@Path("/transfer")
@Produces("application/xml")
public class TransferService {
@GET
@Path("/{id}")
public String getTransfer(@PathParam("id") long id) {
...
}
}
传输服务
@Path("/balance")
@Produces("application/xml")
public class BalanceService {
@GET
@Path("/{id}")
public String getBalance(@PathParam("id") long id) {
...
}
}
@Path("/transfer")
@Produces("application/xml")
public class TransferService {
@GET
@Path("/{id}")
public String getTransfer(@PathParam("id") long id) {
...
}
}
为什么不在班级级别移动/平衡和/转移??
package com.etrade.service;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
@Path("/account")
@Produces("application/xml")
public class TransferService {
@GET
@Produces("application/xml")
@Path("/transfer/{id}")
public String accountTransfer(@PathParam("id") long id) {
System.out.println("transfer id : "+id);
StringBuilder response = new StringBuilder(256);
response.append("<Response>").append("<id>").append(id)
.append("</id>").append("<transfer>").append("250.00").append("</transfer>")
.append("</Response>");
return response.toString();
}
}
http://localhost:8080/rest/account/balance/12
http://localhost:8080/rest/transfer/balance/13
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-bundle-jaxrs</artifactId>
<version>2.5.0</version>
</dependency>
<beans>
<jaxrs:server id="accountService" address="/rest">
<jaxrs:serviceBeans>
<ref bean="accountServiceImpl" />
<ref bean="transferServiceImpl" />
</jaxrs:serviceBeans>
</jaxrs:server>
</beans>
...
@Context("accountServiceImpl")
@Path("/account")
public class Accountservice{
...
@Path("/balance")
@Produces("application/xml")
public class BalanceService {
@GET
@Path("/{id}")
public String getBalance(@PathParam("id") long id) {
...
}
}
@Path("/transfer")
@Produces("application/xml")
public class TransferService {
@GET
@Path("/{id}")
public String getTransfer(@PathParam("id") long id) {
...
}
}