0

我正在使用来自 QueryDsl 的谓词。后端内部使用camelCase,但承诺在与客户端通信时使用snake_case。

我想snake_case用作查询参数,例如

http://localhost:8080/inputmethod?protocol_type=SDK

如果我protocol_type作为snake_case 传递,Query Dsl Predicate 不会解析它。它仅将类型(目标实体类)的字段解析为 camelCase。所以protocol_type被 getPredicate() of 跳过QuerydslPredicateBuilder

    /**
     * Creates a Querydsl {@link Predicate} for the given values, {@link QuerydslBindings} on the given
     * {@link TypeInformation}.
     *
     * @param type the type to create a predicate for.
     * @param values the values to bind.
     * @param bindings the {@link QuerydslBindings} for the predicate.
     * @return
     */
    @Nullable
    public Predicate getPredicate(TypeInformation<?> type, MultiValueMap<String, String> values,
            QuerydslBindings bindings) {
    ...
            if (!bindings.isPathAvailable(path, type)) { // <-- here!
            // path : "protocol_type"
            // type : my.domain.entity.InputMethod
                continue;
            }
   ...
}
   

但它适用于cameCase.

http://localhost:8080/inputmethod?protocolType=SDK

如何将 Predicate 的命名约定设置为snake_case


控制器

    @GetMapping
    public List<InputMethodDto.Response> getInputMethodTypeList(
            @QuerydslPredicate(root = InputMethod.class) Predicate predicate) {
        return service.getInputMethodList(predicate);
    }

实体


@Getter
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class InputMethod {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Enumerated(EnumType.STRING)
    @Column
    private RecordType recordType;

    @Enumerated(EnumType.STRING)
    @Column
    private ProtocolType protocolType;

    @Column
    private String name;

配置


@EnableWebMvc
@EnableSwagger2
@Configuration
public class SwaggerConfig implements WebMvcConfigurer {
    ...
}


杰克逊命名策略 和我一样的问题。

https://stackoverflow.com/questions/53273966/spring-jpa-querydslpredicate-snake-case

我也设置spring.jackson.property-naming-strategy=SNAKE_CASE

4

1 回答 1

0

不幸的是,我担心你不能在这里使用snake_case,因为_它被认为是spring数据映射中的属性拆分器。所以映射器会将其转换protocoltype

于 2020-09-29T21:10:19.983 回答