CQ5组件afteredit

时间:2014-09-23 19:01:10

标签: cq5 aem sling

我创建了一个像这样的吊索servlet骨架......

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

我的页面加载,我的组件加载,我的clientlib js加载,我在控制台中看不到任何错误。我编辑我的组件并点击确定。我的servlet命中,我在日志服务器端拖尾,看不到任何错误。当我打开控制台跟踪时,我看到客户端没有错误。我的回答是200好。一切看起来都很棒!除了我在浏览器的右上角不断收到“未指定的错误”

Unspecified Error

有人知道我甚至开始对此进行故障排除,因为我发现服务器端日志没有错误,客户端控制台上没有错误吗?

更新

感谢@ 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所取代。简单地使用post功能,没有压制,工作

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

现在我坚持使用选项#3,直到我能找出正确的json响应。

3 个答案:

答案 0 :(得分:2)

Unspecified error是由于应用于CQ.HTTP.post()

的默认配置所致

它尝试从响应标头中检索消息并将其通知给用户。由于您的自定义servlet没有提供任何此类消息,因此您收到了此通知。

可以通过将suppressErrorMsg参数设置为true来禁止此通知。即,

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

在进一步观察时,似乎通知消息是根据

时的响应构建的
  1. 响应为HTML
  2. 响应包含一个标记为&#34;消息&#34;的HTML标记。在这种情况下,标签的内容被视为消息。
  3. 通知消息可能使用的示例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

答案 1 :(得分:0)

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

在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;
}

答案 2 :(得分:-1)

您可以使用其中一个ootb sling类来生成正确的响应:

HtmlResponse - &gt;对于HTML格式的回复

JSONResponse - &gt;对于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);