Spring 带下划线的数据剩余排序字段

Spring data rest sorting fields with underscores

我们在连接到 postgres 数据库的 PagingAndSortingRepository 之上使用非常简单的 @RepositoryRestResource 设置。我们还配置了 spring.jackson.property-naming-strategy=SNAKE_CASE 到 return 漂亮 json。在我们开始分类之前,一切都很好。正如我们发现的那样 - 排序要求我们提供实际的 class 字段名称(我们当然有驼峰式):

get("/thing?sort=dateCreated,desc")

当我们尝试做 javascript 友好

get("/thing?sort=date_created,desc")

它悲惨地失败了,因为 jpa 试图用下划线分割参数。

是否有一种简单的方法可以使路径参数的格式与我们正在 return 中的 json 中的格式相同?

尚不清楚您是否可以通过某些 Spring 数据 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);
        }
    }
}

这有一个错误 - DATAREST-883. It was fixed and released. But then, due to regressions (DATAREST-909) this has been dropped in the very next release. I asked them on Github 如果他们计划再次使用它,因为这在过去也曾困扰过我。我们将看看他们对此有何评论。

现在您可以:

  • 随它去吧
  • 使用驼峰式 属性 名字
  • 解决这个问题(例如使用 )- 恕我直言,这似乎很脆弱,但可能会在短期内完成。

我测试过的最近 spring-boot 版本中的功能状态:

  • 1.4.0 (spring-data-rest 2.5.2): 尚未实施
  • 1.4.1 (spring-data-rest 2.5.3): works -> code
  • 1.4.2 (spring-data-rest 2.5.5): 删除