Java 带下划线的Spring数据rest排序字段

Java 带下划线的Spring数据rest排序字段,java,json,spring-data,spring-data-jpa,spring-data-rest,Java,Json,Spring Data,Spring Data Jpa,Spring Data Rest,我们使用一个非常简单的@RepositoryRestResource设置,它位于连接到postgres数据库的分页和排序存储库之上。我们还配置了spring.jackson.property naming strategy=SNAKE\u CASE以返回漂亮的json。在我们开始分类之前,一切都很好。正如我们所发现的,排序要求我们提供实际的类字段名(当然,我们在camel案例中有): get(“/thing?sort=dateCreated,desc”) 当我们尝试对javascript友好时

我们使用一个非常简单的
@RepositoryRestResource
设置,它位于连接到postgres数据库的
分页和排序存储库
之上。我们还配置了
spring.jackson.property naming strategy=SNAKE\u CASE
以返回漂亮的json。在我们开始分类之前,一切都很好。正如我们所发现的,排序要求我们提供实际的类字段名(当然,我们在camel案例中有):

get(“/thing?sort=dateCreated,desc”)

当我们尝试对javascript友好时

get(“/thing?sort=date\u created,desc”)

它失败得很惨,因为jpa试图用下划线分割参数


有没有一种简单的方法可以使路径参数与我们返回的json中的路径参数的格式相同?

不清楚您是否可以用Spring Data Rest特定的方法来实现这一点,但是您应该能够通过标准Servlet过滤器来处理它,该过滤器类似于下面的内容:

public class SortParameterConversionFilter extends GenericFilterBean {

    // as we are extending Spring's GenericFilterBean
    // you can then *possibly* inject the RepositoryRestConfiguration
    // and use  RepositoryRestConfiguration#getSortParamName
    // to avoid hard coding
    private static final String SORT_PARAM_KEY = "sort";

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;

        if (shouldApply(request)) {
            chain.doFilter(new CollectionResourceRequestWrapper(request), res);
        } else {
            chain.doFilter(req, res);
        }
    }

    /**
     * 
     * @param request
     * @return True if this filter should be applied for this request, otherwise
     *         false.
     */
    protected boolean shouldApply(HttpServletRequest request) {
        return request.getServletPath().matches("some-pattern");
    }

    /**
     * HttpServletRequestWrapper implementation which allows us to wrap and
     * modify the incoming request.
     *
     */
    public class CollectionResourceRequestWrapper extends HttpServletRequestWrapper {

        public ResourceRequestWrapper(HttpServletRequest request) {
            super(request);
        }

        @Override
        public String getParameter(final String name) {
            if (name.equals(SORT_PARAM_KEY)) {
                String [] parts = super.getParameter(SORT_PARAM_KEY).split(",");
                StringBuilder builder = new StringBuilder();

                int index = 0;

                for (String part : parts) {
                    // using some mechanism of you choosing
                    // convert from underscore to camelCase
                    // Using the Guava library for example
                    String convertedPart = CaseFormat.LOWER_UNDERSCORE.to(
                         CaseFormat.LOWER_CAMEL, part);
                    ++index;
                    builder.append(convertedPart).append(index < parts.length ? "," : "");
                }

                return builder.toString();
            }

            return super.getParameter(name);
        }
    }
}
公共类SortParameterConversionFilter扩展了GenericFilterBean{
//当我们扩展Spring的GenericFilterBean时
//然后,您可以*可能*注入RepositoryRestConfiguration
//并使用RepositoryRestConfiguration#getSortParamName
//避免硬编码
私有静态最终字符串SORT_PARAM_KEY=“SORT”;
@凌驾
公共无效doFilter(ServletRequest-req、ServletResponse-res、FilterChain链)
抛出IOException、ServletException{
HttpServletRequest请求=(HttpServletRequest)请求;
如果(应申请(请求)){
doFilter(新的CollectionResourceRequestWrapper(请求),res);
}否则{
链式过滤器(要求、恢复);
}
}
/**
* 
*@param请求
*@如果此筛选器应应用于此请求,则返回True,否则返回
*错。
*/
受保护的布尔值应应用(HttpServletRequest){
return request.getServletPath()匹配(“某些模式”);
}
/**
*HttpServletRequestWrapper实现,它允许我们包装和
*修改传入请求。
*
*/
公共类CollectionResourceRequestWrapper扩展了HttpServletRequestWrapper{
公共资源请求包装器(HttpServletRequest请求){
超级(请求);
}
@凌驾
公共字符串getParameter(最终字符串名称){
if(name.equals(排序参数键)){
String[]parts=super.getParameter(SORT_PARAM_KEY).split(“,”);
StringBuilder=新的StringBuilder();
int指数=0;
用于(字符串部分:部分){
//使用一些你选择的机制
//将下划线转换为大小写
//以番石榴库为例
字符串convertedPart=CaseFormat.LOWER\u下划线.to(
CaseFormat.LOWER_CAMEL,零件);
++指数;
append(convertedPart).append(索引
这有一个bug-。它被修复并发布。但是,由于回归()的原因,在下一个版本中已经放弃了这一点。如果他们打算再吃一次,因为这在过去也咬过我。我们将看看他们对此有何评论

目前,您可以:

  • 别管它了
  • 使用驼峰大小写属性名称
  • 解决这个问题(例如,与他人合作)-这看起来很脆弱,但可能会在短期内完成
我测试过的最新spring boot版本中该功能的状态:

  • (spring数据rest 2.5.2):尚未实施
  • (spring数据rest 2.5.3):工作->
  • (弹簧数据rest 2.5.5):下降

您是否尝试过
\uuu
(2个下划线)?(见)是的,这也不起作用。似乎
\uu
仅用于自定义方法。尝试复制它,但效果良好->。你用的是什么版本?哇,谢谢你的调查!我们将等待,直到它被修复:)从sdr 3.4.6开始,这似乎仍然是一个问题……在我的情况下,我需要使用
getParameterValues
而不是
getParameter