2014-09-23 2 views
4

Я создал строп сервлета скелет, как так ...CQ5 компонент afteredit

@SlingServlet(paths = "/bin/foo/bar", methods = "POST") 
public class FooBarServlet extends SlingAllMethodsServlet { 

    private final Logger LOGGER = LoggerFactory.getLogger(this.getClass()); 
    @Override 
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { 

     response.setHeader("Content-Type", "text/plain"); 
     response.getWriter().write("foo bar"); 
     LOGGER.info("hello world"); 
    } 
} 

Я создал редактирования конфигурации для моего компонента

<jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" 
    xmlns:jcr="http://www.jcp.org/jcr/1.0" 
    jcr:primaryType="cq:EditConfig"> 
    <cq:listeners jcr:primaryType="cq:EditListenersConfig" 
        afteredit="myapp.components.foobar" /> 
</jcr:root> 

Я создал cq:ClientLibraryFolder и добавил это Js к нему

var myapp = { components : {} }; 
myapp.components.foobar = function(component, reloadPage) { 
    var oncomplete = function(success) { 
     if (success) { 
      if (reloadPage) document.location.reload(); 
      else component.refreshSelf(); 
     } else 
      console.log('could not foobar on component ' + component.path); 
     }; 

     CQ.HTTP.post('/bin/boo/bar', oncomplete, { path : component.path }); 
}; 

Моя страница загружается, компоненты загружаются, my clientlib js загружается, я не вижу ошибок в консоли. Я редактирую свой компонент и нажимаю ОК. Мой сервлет попал, я забираю сторону сервера журналов и не вижу ошибок. Я не вижу ошибок на стороне клиента, когда открываю консоль для отслеживания. Мой ответ 200 нормально. Все отлично! Кроме того, что я постоянно получаю «Неизвестная ошибка» в правом верхнем углу моего браузера

Unspecified Error

Кто-нибудь знает, где я даже начать устранять это учитывая, что я не вижу никаких ошибок на бревне на стороне сервера, и никаких ошибок на стороне клиента?

Update

Благодаря @ rakhi4110 для ссылки на CQ.HTTP. Я был в состоянии придумать какой-то материал из этой документации

Первый, установив suppressErrorMsg флаг прятали сообщение об ошибке

CQ.HTTP.post('/bin/foo/bar', oncomplete, { path : component.path }, null, true); 

Второй, мне не нравится, чтобы подавить вещи, поэтому я попытался для обработки моего ответа так

{ 
    "headers" : 
    { 
     "Status":200, 
     "Message":"foo bar" 
    } 
} 

Однако это ничего не сделало.

Третий, глядя на CQ.HTTP api, я заметил, что многие из них были лишены в пользу CQ.shared.HTTP. Просто с помощью функции после этого, без Подавить работал

CQ.shared.HTTP.post('/bin/foo/bar', oncomplete, { path : component.path }); 

Пока я придерживаюсь варианта № 3, пока я не могу понять, правильный ответ JSon.

ответ

2

Unspecified error связано с настройками по умолчанию, получать применительно к CQ.HTTP.post()

Он пытается получить сообщение из заголовка ответа и уведомляет его пользователю. Поскольку ваш пользовательский сервлет не предоставляет такого сообщения, вы получили это уведомление.

Можно отменить это уведомление, установив параметр suppressErrorMsg как истинный. то есть,

CQ.HTTP.post('/bin/boo/bar', oncomplete, { path : component.path }, null, true); 

На futher наблюдения, оказывается, что уведомляющее сообщение строится из ответа, когда

  1. Отклик HTML
  2. Ответ содержит HTML-тег с идентификатором, как «Message». В таких случаях содержимое тега считается сообщением.

Образец ответа HTML с помощью которого сообщение уведомления может работать в

<html> 
<head> 
    <title>OK</title> 
</head> 
<body> 
<h1>OK</h1> 
<table> 
    <tbody> 
     <tr> 
      <td>Status</td> 
      <td><div id="Status">200</div></td> 
     </tr> 
     <tr> 
      <td>Message</td> 
      <td><div id="Message">Demo Notification Message</div></td> 
     </tr> 
    </tbody> 
</table> 
</body> 
</html> 

Для дальнейшей конфигурации обратитесь к CQ.HTTP

+0

Подавить работал. Я попытался создать ответ json вроде {"headers": {"Status": 200, "Message": "foo bar"}}. Любые указатели на правильный ответ json? –

0
@Properties({ 
    @Property(name = "sling.servlet.extensions", value = "json"), 
    @Property(name = "sling.servlet.methods", value = "POST"), 
    @Property(name = "service.description", value = " foo bar Servlet") 
} 

в сервлет

@Override 
    protected final void doPost(final SlingHttpServletRequest request, final SlingHttpServletResponse response) 
     throws ServletException, IOException { 
     final String value = request.getRequestParameter("value").getString(); 
      // create response 

     response.setContentType("application/json"); 
     response.setCharacterEncoding("utf-8"); 

     try { 
      final JsonGenerator generator = FACTORY.createJsonGenerator(response.getWriter()); 

      MAPPER.writeValue(generator, Collections.singletonMap("Message", "success")); 
     } catch (final JsonGenerationException jge) { 
      LOG.error("error generating JSON response", jge); 
     } catch (final JsonMappingException jme) { 
      LOG.error("error mapping JSON response", jme); 
     } catch (final IOException ioe) { 
      LOG.error("error writing JSON response", ioe); 
     } 
    } 

В диалоговом окне сделать что-то вроде

postfunction="function(value) { 
    var dialog = this.findParentByType('dialog'); 
    var url = CQ.HTTP.addParameter(dialog.path + '.json', 'value', value); 
    var result = CQ.HTTP.eval(url); 
    return result; 
} 
+0

вы можете ответить на этот вопрос http://stackoverflow.com/questions/29745246/how-to-validate-a-field-using-cq-http-post-method-in-adobe-cq5/29768664?noredirect=1# comment47673194_29768664 – user2142786

-1

Вы можете использовать один из классов OOTB строп для создания правильного ответа:

HtmlResponse -> Для ответов в формате HTML

JSONResponse -> Для ответов в формате JSON

Все наследуются от https://sling.apache.org/apidocs/sling7/org/apache/sling/servlets/post/AbstractPostResponse.html, и вы можете использовать один из методов onXXX для внесения изменений.

Пример:

JSONResponse result = new JSONResponse(); 
result.setStatus(200, "Content changed"); 
result.onChange; 
result.onCopied; 
result.onCreated; 
result.onDeleted; 
result.onModified; 
result.onMoved; 
boolean setStatus = true; 

result.send(slingHttpServletResponse, setStatus); 
+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/10775186) – Blastfurnace

+0

Я не согласен с этим. Если связанная страница изменяется, это означает, что ответ больше не правильный/действительный. В этом случае я бы воздержался от копирования и вставки. Я бы не сделал это общим правилом. –

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