Spring

추가 @RequestBody를 사용하여 POST 요청에서 페이징 클라이언트에 페이징 가능을 전달하는 방법

기록만이살길 2022. 11. 10. 23:58
반응형

추가 @RequestBody를 사용하여 POST 요청에서 페이징 클라이언트에 페이징 가능을 전달하는 방법 물어보다

1. 질문(문제점):

Spring에서 REST 서비스 컨트롤러를 위한 가상 클라이언트를 만들려고 했습니다.

@PostMapping("/search")
public Page<MeasureDto> searchMeasures(@RequestBody MeasureDto example, Pageable pageable) {
    ...
}

클라이언트는 다음과 같습니다.

@PostMapping("/search")
public Page<MeasureDto> searchMeasures(@RequestHeader("apiKey") String apiKey, @RequestBody MeasureDto example, Pageable pageable);

테스트를 실행할 때 다음 예외가 발생합니다.

원인: java.lang.IllegalStateException: 메서드에 본문 매개변수가 너무 많습니다. public abstract org.springframework.data.domain.Page com.foo.bar.jobservice.client.MeasureServiceClient.searchMeasures(java.lang.String,com.example .foo.jobservice.client.dto.MeasureDto,org.springframework.data.domain.Pageable)

내가 이미 알고/시도한 것:

github에 닫힌 문제가 있습니다: https://github.com/spring-cloud/spring-cloud-netflix/issues/556

문제를 해결했어야 하는 커밋 문제:

https://github.com/spring-cloud/spring-cloud-openfeign/issues/26

커밋:

https://github.com/spring-cloud/spring-cloud-openfeign/commit/6e0e63644ba34193f03c2cd74391cac73b9bfdb4

내가 구성한 것:

import feign.codec.Encoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.cloud.openfeign.support.PageJacksonModule;
import org.springframework.cloud.openfeign.support.PageableSpringEncoder;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@EnableFeignClients
@Configuration
public class FeignConfig {

    @Bean
    public PageJacksonModule pageJacksonModule() {
        return new PageJacksonModule();
    }

    @Autowired
    private ObjectFactory<HttpMessageConverters> messageConverters;

    @Bean
    public Encoder feignEncoder() {
        return new PageableSpringEncoder(new SpringEncoder(messageConverters));
    }
}

그래도 작동이 안되는.

내가 사용하는 것:

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>

<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.3.RELEASE</version>

내가 뭘 잘못하고 있죠?


업데이트:

재현 가능한 예제를 만들었습니다.

https://github.com/manuelwaltschek/mre.git

클라이언트 서비스를 시작하거나 spring/spring-cloud-openfeign/375-pageable-not-working/parent/client/src/test/java/com/example/client/HelloServiceClientTest.java를 호출합니다.

github의 미해결 문제: https://github.com/spring-cloud/spring-cloud-openfeign/issues/375 https://github.com/spring-cloud/spring-cloud-openfeign/issues/385

편집: 기본적으로 페이징 가능 클라이언트를 가상 클라이언트에 전달하는 방법을 알고 싶습니다. URL 매개변수로 인코딩할까요?

관련 질문: Spring Pageable을 FeignClient에 전달하는 방법

2. 해결방안:

예외는 "너무 많은 Body 매개변수"와 관련되어 있습니다. 즉, RequestBody에서 하나의 객체만 보내야 함을 의미합니다. 이 특별한 경우에는 "예제"로 MeasureD라고 생각합니다. 다른 방식으로 전달해야 하는 페이지, 일반적으로 클래스에 "페이지" 정수 속성이 있거나(귀하의 경우 MeasureDTO) 다음과 같이 페이지 번호를 @RequestParam으로 보냅니다.

@PostMapping("/search")
public Page<MeasureDto> searchMeasures(@RequestBody MeasureDto example, @RequestParam(required = true) Integer page) {
 
 // PageRequest.Of(numberPage, quantityRegisters) will send a Pageable, in this case bellow, number of page + number of records
    measureService.getMeasurePageable(example, PageRequest.of(page, 10)); 
 }

그럼에도 불구하고 검색하고 저장하지 않는 경우 queryParams와 함께 GetMapping을 사용하는 것을 고려하십시오.

63115610
반응형