使用SyntheticResource前进

时间:2015-08-07 22:46:04

标签: cq5 jcr sling

我正在尝试构建一个Sling servlet,它从JCR返回一个资源的修改值。我不想改变原始资源,所以我创建了一个SyntheticResource并进行操作。然后我使用RequestDispatcher将其返回。

以下代码未按预期返回Modified内容,我也没有在日志中看到任何错误。你能告诉我这里我做错了吗

@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();
            }
        }


    }

}

1 个答案:

答案 0 :(得分:1)

使用ResourceDecorator会更简单,它可以返回实现所需更改的ResourceWrapper。只要小心保持装饰者的decorate方法在调用它不想装饰的Resource时有效,因为它将为所有Resources调用。