当前位置: 首页 > 知识库问答 >
问题:

REST控制器spring 4中的可选@Pathvariable

仰钧
2023-03-14

我正在编写一个Rest服务(HTTP获取endpoint),在下面的uri中执行以下操作

http://localhost:8080/customers/{customer_id}
  1. 获取uri中传递的客户id的详细信息

代码:

@RequestMapping(method = RequestMethod.GET, value = "customers/{customer_id}")
public List<Customer> getCustomers(
@PathVariable(name = "customer_id", required = false) final String customerId) {
LOGGER.debug("customer_id {} received for getCustomers request", customerId);

}

但是,在上面的代码中,对于第二个场景,控件将流向getCustomers()。

注意:我使用的是Java8和SpringWeb4.3.10版本

非常感谢任何对此的帮助。

共有3个答案

祖波光
2023-03-14

您应该在这里创建两个endpoint来处理单个请求:

@GetMapping("/customers")
public List<Customer> getCustomers() {
LOGGER.debug("Fetching all customer");  
}

@GetMapping("/customers/{id}")
public List<Customer> getCustomers(@PathVariable("id") String id) {
LOGGER.debug("Fetching customer by Id {} ",id);  
}

@GetMapping相当于@RequestMapping(method=RequestMethod.GET)@GetMapping(“/customers/{id}”)相当于@RequestMapping(method=RequestMethod.GET,value=“customers/{id}”)

更好的方法是这样的:

@RestController
@RequestMapping("/customers")
public class CustomerController {

    @GetMapping
    public List<Customer> getAllCustomers() {
    LOGGER.debug("Fetching all customer");  
    }

    @GetMapping("/{id}")
    public Customer getCustomerById(@PathVariable("id") String id) {
    LOGGER.debug("Fetching customer by Id {} ",id);  
    }
祁鸿晖
2023-03-14

这可能有助于试图使用多个可选路径变量的人。

如果有多个变量,则始终可以接受多个路径。例如:

@GetMapping(value = {"customers/{customerId}&{startDate}&{endDate}",
"customers/{customerId}&{startDate}&",
"customers/{customerId}&&{endDate}",
"customers/{customerId}&&"
})
public Customer getCustomerUsingFilter(@PathVariable String customerId, @PathVariable Optional<Date> startDate, @PathVariable Optional<Date> endDate)

然后您将使用所有路径分隔符调用此URL(在本例中

喜欢
获取 /customers/1

阎经武
2023-03-14

只有当您想将GET/customers/{customer_id}GET customers映射到单个java方法时,才使用可选的@PathVariable

如果不发送customer_id,则无法发送将发送到GET /customers/{customer_id}的请求。

所以在你的情况下,它将是:

@RequestMapping(method = RequestMethod.GET, value = {"/customers", "customers/{customer_id}"})
public List<Customer> getCustomers(@PathVariable(name = "customer_id", required = false) final String customerId) {
    LOGGER.debug("customer_id {} received for getCustomers request", customerId);
}

需要公共抽象布尔值

path变量是否是必需的。

默认为true,如果传入请求中缺少路径变量,则会引发异常。如果您喜欢null或Java8,请将此选项切换为falsejava.util.在这种情况下是可选的。

您可以使用java8中的nullOptional

 类似资料:
  • easySwoole支持REST风格开发。在实现上,其实是对AbstractController进行了REST规则封装,本质上,也是一个控制器。 支持GET、POST、PUT、PATCH、DELETE、HEAD、OPTIONS。 实例代码 namespace AppControllerRest; use CoreAbstractInterfaceAbstractREST; use CoreHttp

  • Rest 控制器是什幺? Rest 控制器是 Base 控制器的扩充并内建支援 RESTful。 这能让你轻鬆建立 API。 请注意: 如果你在你的 REST 控制器使用 before() 或 router 方法, 你 必须 呼叫父层方法 parent::before()(或路由)以保持正常运作。 使用 Rest 控制器 如同所有的控制器,你在 fuel/app/classes/controlle

  • 我想构建一个能够处理多个可选排序查询的spring控制器。根据Spring.io规范,这些查询应该这样格式化 域 储存库 服务

  • 我正在开发一个新的应用程序,它是和camel。我将RESTendpoint作为该应用程序的一部分公开。 null 你能帮我选择更好的方案吗?

  • 我想验证请求参数。我已经浏览了很多博客并回答了问题,我也做了同样的事情。在控制器类上添加了@Validated。 控制器中的方法: 控制器建议 配置: 完成所有这些之后,现在我得到一个404错误。"状态":404,"错误":"未找到","消息":"没有可用的消息"

  • 我试图使用mockmvcbuilders.standalonesetup方法为一个spring mvc rest控制器创建一个非常基本的单元测试。我一直收到一个404错误。下面列出了测试应用程序上下文、测试类、控制器和整个堆栈跟踪。欢迎任何指导。 java.lang.AssertionError:状态应为:<200>但实际为:<404>在org.springframework.test.util.