카테고리 없음

봄 데이터. 스네이크 케이스 매개 변수를 사용하여 정렬

기록만이살길 2021. 2. 19. 01:36
반응형

봄 데이터. 스네이크 케이스 매개 변수를 사용하여 정렬

질문(문제점):

snake_case 형식의 나머지 컨트롤러에 정렬 매개 변수를 전달하는 방법을 알려 주시겠습니까?

내 엔티티 클래스

@Entity
public class MyEntity extends BaseEntity{

  @Id
  private Long id;

  @Column
  private Long parentId;
}

컨트롤러 방식

@GetMapping("list")
    List<MyEntity> getEntityList(
           @PageableDefault(sort = {"id"}, direction = Sort.Direction.DESC) Pageable pageable);
}

요청에 사용하고 싶습니다 ?sort=parent_id

Jackson2ObjectMapperBuilder를 만들었고 올바른 snake_case json을 빌드합니다.

그러나 봄은 봄 Caused by: org.springframework.data.mapping.PropertyReferenceException: No property parent found for type MyEntity! Did you mean 'parentId'?이 '_'기호 뒤에 모든 것을 잘라 내기 때문에 이것이 파싱에 관한 문제라고 생각합니다.

난 노력 했어:

  • @JsonNaming (PropertyNamingStrategy.SnakeCaseStrategy.class)
  • @Column (name = "parent_id") @JsonProperty ( "parent_id")
  • @JsonNaming (PropertyNamingStrategy.SnakeCaseStrategy.class)

해결방안:

나는 문제를 해결했다. snake_case 매개 변수 값을 올바르게 사용하려면 사용자 정의 OncePerRequestFilter를 작성해야합니다. 이 필터는 컨트롤러로 전달하기 전에 매개 변수를 준비합니다.

사용자 nullptr은 여기에서 같은 방식으로 사용 되었습니다 . 그런데 필터를 사용하면 다른 매개 변수 / 값을 준비 할 수 있지만이 솔루션은 실수를 일으킬 수 있습니다. 모든 요청은 필터를 통과합니다.

@Configuration
public class SnakeCaseFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {

        final Map<String, String[]> formattedParams = new ConcurrentHashMap<>();

        //Convert values for each parameter
        for (String param : request.getParameterMap().keySet()) {
            String[] values = request.getParameterValues(param);

            String formattedParam = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, param);

        formattedParams.put(formattedParam, values);
        }

        filterChain.doFilter(new CustomResponseWrapper(request, formattedParams), response);

    }


    /**
     * Wrapper return new formatted parameters
     */
     class CustomResponseWrapper extends HttpServletRequestWrapper {

        /**
         * Constructs a request object wrapping the given request.
         *
         * @param request the {@link HttpServletRequest} to be wrapped.
         * @throws IllegalArgumentException if the request is null
         */

        private Map<String, String[]> params;

        public CustomResponseWrapper(HttpServletRequest request, Map<String, String[]> params) {
            super(request);
            this.params = params;
        }

        @Override
        public Map<String, String[]> getParameterMap() {
            return params;
        }

        @Override
        public String[] getParameterValues(String name) {
            return params.get(name);
        }

    }
}
65679359
반응형