【问题标题】:Apache CXF client to access multiple resourcessApache CXF 客户端访问多个资源
【发布时间】:2015-08-28 14:59:13
【问题描述】:

我的问题可能很愚蠢,但我是网络服务领域的新手,我找到了一个教程,但我对此有些怀疑。它正在使用Apache CXF。我有拥有所有资源的Calculator 类,将启动服务器的CalculatorStartUp 和拥有更多客户端的Client 类。 下面是代码:

    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.PathParam;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;

    @Path("/calc")
    public class Calculator {

        @GET
        @Path("/add/{a}/{b}")
        @Produces(MediaType.TEXT_PLAIN)
        public String addPlainText(@PathParam("a") double a, @PathParam("b") double b) {
            return (a + b) + "";
        }

        @GET
        @Path("/sub/{a}/{b}")
        @Produces(MediaType.TEXT_PLAIN)
        public String subPlainText(@PathParam("a") double a, @PathParam("b") double b) {
            return (a - b) + "";
        }
    }

服务器:

import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;

public class CalculatorStartUp {

    public static void main(String[] args) {
         JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
            sf.setResourceClasses(Calculator.class);
            sf.setResourceProvider(Calculator.class, 
                new SingletonResourceProvider(new Calculator()));
            sf.setAddress("http://localhost:9999/calcrest/");
            Server server = sf.create();

    }
}

客户:

import org.apache.cxf.jaxrs.client.WebClient;

public class Client {
    final static String REST_URI = "http://localhost:9999/calcrest";
    final static String ADD_PATH = "calc/add";
    final static String SUB_PATH = "calc/sub";
    final static String MUL_PATH = "calc/mul";
    final static String DIV_PATH = "calc/div";

    public static void main(String[] args) {
        int a = 122;
        int b = 34;
        String s = "";

        WebClient plainAddClient = WebClient.create(REST_URI);
        plainAddClient.path(ADD_PATH).path(a + "/" + b).accept("text/plain");
        s = plainAddClient.get(String.class);
        System.out.println(s);

        WebClient plainSubClient = WebClient.create(REST_URI);
        plainSubClient.path(SUB_PATH).path(a + "/" + b).accept("text/plain");
        s = plainSubClient.get(String.class);
        System.out.println(s);
    }

我的问题是:

  1. 为什么有两个客户端?如果我为muldiv 资源编写一些资源怎么办?我需要添加更多资源吗?为什么要为每个资源编写一个客户端?必须有一种方法可以只创建一个可以访问特定资源的客户端。

  2. 我看到在创建 Web 客户端时,您可以传递提供者或提供者列表。谁能解释这些提供者代表什么?

我将不胜感激!

【问题讨论】:

    标签: java web-services rest cxf


    【解决方案1】:

    对于您的问题:

    1. 您可以重复使用相同的 WebClient。如果你想重复使用它需要调用WebClient.back(true)WebClient.replacePath(path)来更新路径并且可以重复使用相同的baseURI。
    2. 您可以使用WebClient.create(String baseAddress, List<?> providers),其中第二个参数是提供 JAX-RS 提供程序,例如 JacksonJsonProvider。提供程序用于自定义 JAX-RS 运行时。 WebClient client = WebClient.create(REST_URI, Collections.singletonList(new JacksonJsonProvider()));

    有关 JAX-RS 提供程序的更多信息:What does Provider in JAX-RS mean?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-22
      • 2014-12-12
      • 2017-06-13
      • 1970-01-01
      • 2011-09-12
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多