Я пытаюсь построить сервлет 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();
}
}
}
}
Спасибо за ответ. Это помогло мне исправить мое решение. – Silican