Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Spring在CXF中配置多个ResourceBean_Spring_Class_Cxf - Fatal编程技术网

使用Spring在CXF中配置多个ResourceBean

使用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

我正在使用CXF RS 2.5.1和Spring 3.0.6版本。我希望“一个端点”有多个实现类。我看到这个问题已经报告并修复,但是,当我尝试这样做时,CXF只是从jaxrs:serviceBeans标记中选择第一个资源类。对于另一个请求,我在tomcat控制台上看到的消息是“找不到与请求路径/帐户/rest/传输匹配的操作”。下面是配置。感谢您的任何意见

web.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"/>

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) {
       ...      
    }
}