我在 CQ 中使用 Sling Servlet 时遇到一些问题。在请求 servlet 时,我收到一个异常消息
Caused by: org.apache.sling.api.resource.PersistenceException: Resource at '/bin/feedServlet' is not modifiable.
at org.apache.sling.servlets.post.impl.helper.SlingPropertyValueHandler.setProperty(SlingPropertyValueHandler.java:153)
at org.apache.sling.servlets.post.impl.operations.ModifyOperation.writeContent(ModifyOperation.java:411)
at org.apache.sling.servlets.post.impl.operations.ModifyOperation.doRun(ModifyOperation.java:101)
在 servlet 中,我尝试使用 @Reference
注释注入(inject) 2 个服务。
请给我一些解决这个问题的指示。请在下面找到我的 Servlet 代码(不完整):
@Component(immediate = true, metatype = false, label = "feedServlet")
@Service(Servlet.class)
@Properties(value = { @org.apache.felix.scr.annotations.Property(name = "sling.servlet.methods", value = "POST"),
@org.apache.felix.scr.annotations.Property(name = "sling.servlet.paths", value = "/bin/feedServlet") })
public class FeedServlet extends SlingAllMethodsServlet {
private static final long serialVersionUID = -2139716879248038562L;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY, policy = ReferencePolicy.STATIC)
private ContentSearchService searchService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY, policy = ReferencePolicy.STATIC)
private FeedGeneratorService feedService;
@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServerException,
IOException {
ResourceResolver resourceResolver = request.getResourceResolver();
List<Hit> list = null;
String feed = null;
try {
list = search(request, searchService);
feed = feedService.generateFeed(list, resourceResolver);
} catch (Throwable e) {
}
response.getWriter().write(feed);
}
注意:如果没有这些服务,servlet 现在可以正常工作( previous thread )。这是依赖注入(inject)的问题吗?此 bundle 的 serviceComponets.xml
将这些服务定义为:
<scr:component enabled="true" immediate="true" name="com.acme.wcm.cq.servlet.FeedServlet">
<implementation class="com.acme.wcm.cq.servlet.FeedServlet"/>
<service servicefactory="false">
<provide interface="javax.servlet.Servlet"/>
</service>
<property name="sling.servlet.methods" type="String" value="POST"/>
<property name="sling.servlet.paths" type="String" value="/bin/feedServlet"/>
<property name="service.pid" value="com.acme.wcm.cq.servlet.FeedServlet"/>
<reference name="searchService" interface="com.acme.wcm.cq.search.ContentSearchService" cardinality="1..1" policy="static" bind="bindSearchService" unbind="unbindSearchService"/>
<reference name="feedService" interface="com.acme.wcm.cq.feed.FeedGeneratorService" cardinality="1..1" policy="static" bind="bindFeedService" unbind="unbindFeedService"/>
</scr:component>
最佳答案
我认为您的 servlet 未处理您发出的 POST 请求。
看SlingProprtyValueHandler的代码: src of SlingProprtyValueHandler
CQ 不使用您的 servlet,因此它认为“/bin/feedServlet”处有一个资源,并尝试修改它(因为它是一个 POST 请求),但没有任何资源,这就是您的原因遇到异常。
请为您的servet创建一个doGet方法并尝试发出get请求,我确信它不会工作。
检查您的 servlet 在/system/console/components 下是否处于事件状态。
您还可以在/system/console/configMgr/检查“Apache Sling Servlet/Script Resolver and Error Handler”下检查/bin路径是否允许。
希望这会有所帮助!
附:最好将 servlet 映射到资源而不是路径。示例代码在这里 how to map a servlet to a resource
因此,您可以创建一个类似/etc/myApp/services 的路径,并在该路径下创建类型类似 etc/myApp/services/myService 的 myService 节点,并且可以将 servlet 映射到此资源类型。
关于servlets - CQ 中的 Sling Servlet - 资源不可修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23174267/