从历史上看,我只使用过CQ 5.6,但现在正在使用5.3进行项目,并且无法获得注册和访问的servlet。当我尝试命中servlet时(有和没有和扩展名)我在错误日志中得到以下 INFO 行:
GET /bin/TestServlet.json HTTP/1.1] org.apache.sling.engine.impl.SlingMainServlet service: Resource /bin/TestServlet.json not found
我可以构建包含servlet的bundle,使用maven-sling-plugin进行部署,然后bundle在控制台中以“活动”结束,但servlet不可用。我在我的类文件中使用以下内容来定义servlet:
@SlingServlet(paths = {"/bin/TestServlet"}, methods = {"GET"}, extensions = {"json"}, metatype = true)
@Properties({
@Property(name = "service.name", value = "com.something.servlets.TestServlet", propertyPrivate = true),
@Property(name = "service.description", value= "Test servlet I am trying to geet working", propertyPrivate = true),
@Property(name = "service.vendor", value = "something", propertyPrivate = true)
})
请注意,我还使用@Component(.......)
和@Service(value=Servlet.class)
注释
看看问题是否是基于配置的(思考/ bin被阻止)我回到5.6.1来比较配置并注意到 Apache Sling Servlet / Script Resolver和Error Handler的配置 在5.3和5.6之间有所不同。
在5.6中,您可以配置servletresolver.paths(如果我理解正确的话)打开执行路径,但这在5.3中不存在
所以:
提前致谢
编辑(决议): 它似乎取决于POM中的版本(以及可能的插件配置)。可能只是罪魁祸首,但我没有时间尝试所有的排列。如果我有时间尝试,我会添加一个编辑。
成功版本: maven-bundle-plugin - v2.4.0 maven-scr-plugin - v1.13.0 maven-sling-plugin - v2.1.0
答案 0 :(得分:2)
在CQ5.3中,你可以使用JCR解析器'检查servlet映射。 转到
http://localhost:4502/system/console/jcrresolver
在“配置测试”中输入servlet的路径。 e.g。
http://localhost:4502/bin/TestServlet
解析结果应映射到您的servlet 例如
ServletResource, servlet=com.test.impl.HelloJSONServlet, path=/bin/TestServlet
还有一些代码片段可以在CQ5.3中使用
@Component(immediate = true, metatype = false, label = "Hello JSON Servlet")
@Service(serviceFactory = false, value = javax.servlet.Servlet.class)
@Properties(value = {
@org.apache.felix.scr.annotations.Property(name = "sling.servlet.methods", value = { "GET" }),
@org.apache.felix.scr.annotations.Property(name = "sling.servlet.extensions", value = { "json" }),
@org.apache.felix.scr.annotations.Property(name = "sling.servlet.paths", value = {"/bin/TestServlet"})
})
public class HelloJSONServlet extends SlingAllMethodsServlet {
protected void doGet(SlingHttpServletRequest request,
SlingHttpServletResponse response) throws ServletException,
IOException {
String username = request.getParameter("username");
response.setContentType("application/json");
response.getWriter().write("{ \"hello\" : \""+username+"\" }");
}
}