카테고리 없음
봄 데이터. 스네이크 케이스 매개 변수를 사용하여 정렬
기록만이살길
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<>();
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);
}
class CustomResponseWrapper extends HttpServletRequestWrapper {
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