java - Feign Client GET 请求,从微服务中抛出 "Method Not Allowed: Request method ' POST' not supported"

标签 java spring-boot spring-mvc microservices feign

我有一个带有 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... Logs

任何有助于弄清楚为什么 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/

相关文章:

java - 声明 List<Integer> 与 ArrayList<Integer> 之间有什么区别?

java - 使用 Spring Security 的多个用户

spring-mvc - Spring 3 MVC 和 Tiles 2.2

java - 从 ListView 中获取选定的行号

java - 取消选中java中的复选框

java - 当传递基类类型的引用时,JSON 仅序列化基类字段

java - 无法读取架构文档 'http://www.springframework.org/schema/security/spring-security-4.0.xsd'

java - 部署在 Heroku 上的 Spring Boot 应用程序仍然崩溃

spring-boot - 如何从 GitLab 存储库将 Web 应用程序部署到 AWS 实例

java - 使用 CrudRepository 从 View 获取数据