如果没有使用@Path 变量注释,CXF 如何处理 API?

How CXF Handles APIs If those are not annotated with the @Path Variable?

场景1:在我的工作中遇到了以下场景,其中:getText1、getText2、getText3、getText4、getText5、getText6没有@Path注解,

但是当我调用 API (http://localhost:8080/.../testqa/ ) 时,它总是 returns 以下结果:

{
    "name" : "Sumit1 Arora",
    "age" : 21,
    "address" : "Lakshay1 Arora"
}

SimpleQAImpl

@Service("qaservice")
@Path("/testqa")
public class SimpleQAImpl {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/simpleqa")
    public Person getText() {
        return new Person("Sumit Arora",21,"Lakshay Arora");
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Person getText1() {
        return new Person("Sumit1 Arora",21,"Lakshay1 Arora");
    }



    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Person getText3() {
        return new Person("Sumit3 Arora",21,"Lakshay3 Arora");
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Person getText4() {
        return new Person("Sumit4 Arora",21,"Lakshay4 Arora");
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Person getText5() {
        return new Person("Sumit5 Arora",21,"Lakshay5 Arora");
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Person getText6() {
        return new Person("Sumit6 Arora",21,"Lakshay6 Arora");
    }
}
  1. 如果 @Path 没有像上面的情况或其他情况那样给出,请告诉我 Apache CXF 是如何工作的?

  2. 有什么参考可以理解这些东西吗?


场景 2:在这种场景下,没有在 API 调用之上定义 @Path 变量,如何从 URI 调用所有这些 API?

@Service
@Path("/customer")
public class CustomerResource {

    private final Logger logger = LoggerFactory.getLogger(CustomerResource.class);

    @Autowired
    private CustomerService customerService;

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response create(Customer customer) {

        if(customerService.createCustomer(customer).isPresent()) {
            return Response.ok().build();
        } else
        return Response.status(Response.Status.BAD_REQUEST).entity(new Error(1,"test")).build();
    } 

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getAll() {
        logger.debug("Received request to fetch all the customers.");
        List<Customer> customers = customerService.fetchAll();
        GenericEntity<List<Customer>> customerEntities = new GenericEntity<List<Customer>>(customers) {};
        return Response.ok(customerEntities).build();
    }

    @PUT
    @Consumes(MediaType.APPLICATION_JSON)
    public Response update(Customer customer) {
        return Response.status(Response.Status.NO_CONTENT).build();
    } 
}

关于 CXF 如何选择执行哪个方法的文档在这里:CXF resource selection overview。该文档通过查看哪个具有更多路径参数或更多更具体的路径来讨论它更喜欢哪种方法,但是第一个场景中的每个方法都具有相同的路径,因此选择第一个。要区分它们,您可以使用路径参数。

第二种情况要求您更改与 URL 一起使用的 HTTP 方法,因此:

  • POST/客户
  • 获取/客户
  • PUT /客户

每个人都会调用不同的方法。