2015-08-07 2 views
1

Я пытаюсь построить сервлет Sling, который возвращает измененное значение ресурса из JCR. Я не хочу менять исходный ресурс, поэтому я создаю SyntheticResource и делаю свои манипуляции. Затем я возвращаю его обратно с помощью RequestDispatcher.Sling Forward с SyntheticResource

Следующий код не возвращает измененный контент, как ожидалось, и я также не вижу ошибок в журнале. Можете ли вы сказать мне, что я делаю неправильно здесь

@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

Использование ResourceDecorator было бы проще, он может возвращать ResourceWrapper, реализующий необходимые изменения. Просто будьте осторожны, чтобы метод декоратора decorate был эффективным, когда он вызвал Resource, который он не хочет украшать, так как он будет вызываться для всех Resources.

+0

Спасибо за ответ. Это помогло мне исправить мое решение. – Silican

Смежные вопросы