与 SyntheticResource 一起前行

Sling Forward with SyntheticResource

我正在尝试构建一个 Sling servlet,它 return 是来自 JCR 的资源的修改值。我不想更改原始资源,因此我创建了一个 SyntheticResource 并进行了操作。然后我 return 使用 RequestDispatcher 返回它。

以下代码没有 return 预期的修改内容,我也没有在日志中看到任何错误。你能告诉我我做错了什么吗

@SlingServlet(methods = "GET", resourceTypes = "sling/components/test", selectors = "test")
public class TestServlet extends SlingSafeMethodsServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 4078524820231933974L;

    private final Logger log = LoggerFactory.getLogger(getClass());

    @Reference
    ResourceResolverFactory resolverFactory;

    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
        Map<String, Object> param = new HashMap<String, Object>();
        ResourceResolver resolver = null;
        response.setContentType("text/html");
        StringWriterResponse writerResponse = new StringWriterResponse(response);
        PrintWriter writer = response.getWriter();

        try {
            param.put(ResourceResolverFactory.SUBSERVICE, "testService");
            final String path = request.getRequestPathInfo().getResourcePath();
            resolver = resolverFactory.getServiceResourceResolver(param);
            final Resource resource = resolver.getResource(path);
            String resourceType = resource.getResourceType();

            Resource testResource = new SyntheticResource(resolver,
                    path, resourceType) {
                public <T> T adaptTo(Class<T> type) {
                    if (type == ValueMap.class) {
                        ModifiableValueMap map = resource
                                .adaptTo(ModifiableValueMap.class);
                        map.put("jcr:title", "Modified Title");
                        return (T)map;
                    }
                    return super.adaptTo(type);
                }
            };

            RequestDispatcherOptions requestDispatcherOptions = new RequestDispatcherOptions();
            requestDispatcherOptions.setReplaceSelectors("");
            final RequestDispatcher requestDispatcher = request.getRequestDispatcher(testResource, requestDispatcherOptions);

            requestDispatcher.forward(request, writerResponse);


            // log.debug( writerResponse.getString() );

            writer.println(writerResponse.getString());
            response.setStatus(HttpServletResponse.SC_OK );
        } catch (Exception e) {
            log.error("Exception: ", e);
        } finally {
            if( resolver != null) {
                resolver.close();
            }
            if( writer != null ){
                writer.close();
            }
            if (writerResponse != null) {
                writerResponse.clearWriter();
            }
        }


    }

}

使用 ResourceDecorator 会更简单,它可以 return 实现所需更改的 ResourceWrapper。当调用它不想装饰的 Resource 时,请注意保持装饰器的 decorate 方法高效,因为它将为所有 Resources.[=15= 调用]