我有一个带有 spring 后端的 Vue.js 应用程序,它通过 Feign 客户端调用“订单”微服务。我有许多使用@PathVariable(s) 工作正常的 GET 请求,但我有 1 个 GET 请求,它可以将任意数量的不同 URL 参数传递给它,并且定义了一个 OrderListItemParameters 类并将其添加到 GET 请求中,将参数传递给微服务。我可以看到请求正在发送到微服务,但它被拒绝并出现“org.zalando.problem.spring.common.AdviceTrait:不允许的方法:不支持请求方法‘POST’”错误。
我已确保假客户端发送的 OrderListItemParameters 与微服务中预期的 OrderListItemParameters 匹配。并且在 Feign 客户端或微服务中都没有提及 POST。我只有 GET 和 PUT 端点。
前端代码的 Java 后端:
@RestController
@RequestMapping("/api")
public class OrdersResource {
## THIS WORKS NO PROBLEM
@GetMapping("/order/{orderId}")
public @ResponseBody
ResponseEntity<?> order(@PathVariable int orderId) throws Exception {
return ResponseEntity.ok(orderClient.order(orderId));
}
## THIS ENDPOINT IS THE ONE THAT FAILS
@GetMapping("/order/list")
public @ResponseBody
ResponseEntity<?> orders(OrderListItemParameters orderListItemParams) {
return ResponseEntity
.ok(orderClient.getOrderList(orderListItemParams));
}
}
@Component
@AuthorizedUserFeignClient(name = "orders")
public interface OrderClient {
## THIS WORKS NO PROBLEM
@RequestMapping(method = RequestMethod.GET, value = "/api/order/pg/{orderId}")
String order(@PathVariable("orderId") int orderId);
## THIS ENDPOINT IS THE ONE THAT FAILS
@RequestMapping(method = RequestMethod.GET, value = "/api/order/list")
String getOrderList(OrderListItemParameters orderListItemParams);
}
OrderListItemParameters 类作为 URL 参数传入:(这在微服务中是相同的)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OrderListItemParameters implements Serializable {
private String searchPhrase;
private String startDate;
private String endDate;
private ArrayList<String> sortKey;
private ArrayList<String> sortValue;
private Integer from;
private Integer size;
}
(with getters, and setters)
微服务 Controller :
@Controller
@RequestMapping("/api")
public class OrderController {
## THIS WORKS NO PROBLEM
@GetMapping("/order/pg/{orderId}")
public @ResponseBody
Order pgorder(@PathVariable int orderId) {
return orderService.getPgOrderById(orderId);
}
## THIS ENDPOINT IS THE ONE THAT FAILS
@GetMapping("/order/list")
public @ResponseBody
ResponseEntity getOrderListItemsByMerchant(OrderListItemParameters orderListItemParams) {
return orderService
.getOrderListItemsByMerchant(orderListItemParams);
}
这是日志的图片:Clearly Stating GET requests...
任何有助于弄清楚为什么 Controller 认为这是一个 POST 请求的帮助都会很棒。
最佳答案
这是最终有效的解决方案......
#Resource
@GetMapping("/order/list")
public @ResponseBody
ResponseEntity<?> getOrderListItemsByMerchant(
@RequestParam Map<String, Object> params) {
// method code
}
#Feign Client
@RequestMapping(method = RequestMethod.GET, value = "/api/order/list")
ResponseEntity<String> getOrderList(@RequestParam Map<String, Object> params);
#Microservice Controller
@GetMapping("/order/list")
public @ResponseBody
ResponseEntity getOrderListItemsByMerchant(OrderListItemParameters orderListItemParams) {
// method code
}
这允许我获取带有动态参数的 URL,并且微服务仍然将请求视为 GET。
在请求的两边有相同的定义对象会很好,但我根本无法使@SpringQueryMap 或@QueryMap 工作。
我讨厌假装。
关于java - Feign Client GET 请求,从微服务中抛出 "Method Not Allowed: Request method ' POST' not supported",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58468968/