AEM Servlet 未被执行
AEM Servlet not getting executed
我有一个带有 OSGI 注释的 servlet,如下所示
@Component( immediate = true, service = Servlet.class, property = { "sling.servlet.extensions=json",
"sling.servlet.paths=/example/search", "sling.servlet.methods=get" } )
public class SearchSevrlet
extends SlingSafeMethodsServlet {
@Override
protected void doGet( final SlingHttpServletRequest req, final SlingHttpServletResponse resp )
throws ServletException, IOException {
log.info("This is not getting called ");
}
}
但是当我尝试使用 JQuery
访问 servlet 时
$.get( "/example/search.json", function( data ) {
$( ".result" ).html( data );
alert( "Load was performed." );
});
我得到的是以下信息,而不是执行的 servlet。
{"sling:resourceSuperType":"sling/bundle/resource","servletClass":"com.group.aem.example.servlet.SearchSevrlet","sling:resourceType":"/example/search.servlet","servletName":"com.group.aem.example.servlet.SearchSevrlet"}
如果我需要进行任何其他配置,请告诉我。
您得到的信息是 Default JSON Servlet
的答案
您正在用 属性 "sling.servlet.paths" 注册 "SearchServlet"。此 属性 定义为:
sling.servlet.paths: A list of absolute paths under which the servlet is accessible as a Resource. The property value must either be a single String, an array of Strings...
这意味着只有当您请求完全相同的路径时才会触发您的 servlet,在本例中 "/example/search",如下所示:
GET /example/search
我建议您在 Servlet 中使用属性 "resourceTypes" 和 "selectors" 而不是 "paths"。例如,更好的配置可以是:
property = {
"sling.servlet.resourceTypes=/example/search.servlet",
"sling.servlet.selectors=searchselector",
"sling.servlet.extensions=json",
"sling.servlet.methods=GET"
}
使用此配置,您的 SearchServlet 应该通过对 resourceType="/example/search.servlet"[=] 资源的 GET 请求触发。 33=],带有选择器 "searchselector" 和扩展名 "json"。例如:
GET /corcoran/search.searchselector.json
我和你有类似的问题。
为了找出问题所在,我检查了“最近的请求”页面。
(在 http://localhost:4502/system/console/requests。)
在我的例子中,有一个日志说,“不会在 (我的请求路径) 寻找 servlet,因为它不在列表中允许的路径”。
所以我转到“Config Manager”页面(位于 http://localhost:4502/system/console/configMgr),并搜索“” Apache Sling Servlet/Script 解析器和错误处理程序".
它有一个名为“执行路径”的列表,我将我的请求路径添加到列表中。
将我的路径加入列表后,问题解决
我有一个带有 OSGI 注释的 servlet,如下所示
@Component( immediate = true, service = Servlet.class, property = { "sling.servlet.extensions=json",
"sling.servlet.paths=/example/search", "sling.servlet.methods=get" } )
public class SearchSevrlet
extends SlingSafeMethodsServlet {
@Override
protected void doGet( final SlingHttpServletRequest req, final SlingHttpServletResponse resp )
throws ServletException, IOException {
log.info("This is not getting called ");
}
}
但是当我尝试使用 JQuery
访问 servlet 时$.get( "/example/search.json", function( data ) {
$( ".result" ).html( data );
alert( "Load was performed." );
});
我得到的是以下信息,而不是执行的 servlet。
{"sling:resourceSuperType":"sling/bundle/resource","servletClass":"com.group.aem.example.servlet.SearchSevrlet","sling:resourceType":"/example/search.servlet","servletName":"com.group.aem.example.servlet.SearchSevrlet"}
如果我需要进行任何其他配置,请告诉我。
您得到的信息是 Default JSON Servlet
的答案您正在用 属性 "sling.servlet.paths" 注册 "SearchServlet"。此 属性 定义为:
sling.servlet.paths: A list of absolute paths under which the servlet is accessible as a Resource. The property value must either be a single String, an array of Strings...
这意味着只有当您请求完全相同的路径时才会触发您的 servlet,在本例中 "/example/search",如下所示:
GET /example/search
我建议您在 Servlet 中使用属性 "resourceTypes" 和 "selectors" 而不是 "paths"。例如,更好的配置可以是:
property = {
"sling.servlet.resourceTypes=/example/search.servlet",
"sling.servlet.selectors=searchselector",
"sling.servlet.extensions=json",
"sling.servlet.methods=GET"
}
使用此配置,您的 SearchServlet 应该通过对 resourceType="/example/search.servlet"[=] 资源的 GET 请求触发。 33=],带有选择器 "searchselector" 和扩展名 "json"。例如:
GET /corcoran/search.searchselector.json
我和你有类似的问题。
为了找出问题所在,我检查了“最近的请求”页面。 (在 http://localhost:4502/system/console/requests。)
在我的例子中,有一个日志说,“不会在 (我的请求路径) 寻找 servlet,因为它不在列表中允许的路径”。
所以我转到“Config Manager”页面(位于 http://localhost:4502/system/console/configMgr),并搜索“” Apache Sling Servlet/Script 解析器和错误处理程序".
它有一个名为“执行路径”的列表,我将我的请求路径添加到列表中。
将我的路径加入列表后,问题解决