Spring Data REST: projection representation of single resource

前端 未结 2 1873
孤街浪徒
孤街浪徒 2020-12-21 16:16

I have a simple UserRepository which exposed using Spring Data REST. Here is the User entity class:

@Document(collecti         


        
2条回答
  •  [愿得一人]
    2020-12-21 16:42

    I was looking at something similar recently and ended up going round in circles when trying to approach it from the Spring Data /Jackson side of things.

    An alternative, and very simple solution, then is to approach it from a different angle and ensure the Projection parameter in the HTTP request is always present. This can be done by using a Servlet Filter to modify the parameters of the incoming request.

    This would look something like the below:

    public class ProjectionResolverFilter extends GenericFilterBean {
    
        private static final String REQUEST_PARAM_PROJECTION_KEY = "projection";
    
        @Override
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
                throws IOException, ServletException {
    
            HttpServletRequest request = (HttpServletRequest) req;
    
            if (shouldApply(request)) {
                chain.doFilter(new ResourceRequestWrapper(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-path");
        }
    
        /**
         * HttpServletRequestWrapper implementation which allows us to wrap and
         * modify the incoming request.
         *
         */
        public class ResourceRequestWrapper extends HttpServletRequestWrapper {
    
            public ResourceRequestWrapper(HttpServletRequest request) {
                super(request);
            }
    
            @Override
            public String getParameter(final String name) {
                if (name.equals(REQUEST_PARAM_PROJECTION_KEY)) {
                    return "nameOfDefaultProjection";
                }
    
                return super.getParameter(name);
            }
        }
    }
    

提交回复
热议问题