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数据rest 2.5.2):尚未实施
- (spring数据rest 2.5.3):工作->
- (弹簧数据rest 2.5.5):下降
\uuu
(2个下划线)?(见)是的,这也不起作用。似乎\uu
仅用于自定义方法。尝试复制它,但效果良好->。你用的是什么版本?哇,谢谢你的调查!我们将等待,直到它被修复:)从sdr 3.4.6开始,这似乎仍然是一个问题……在我的情况下,我需要使用getParameterValues
而不是getParameter