servlets - CQ 中的 Sling Servlet - 资源不可修改

标签 servlets osgi aem sling

我在 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/

相关文章:

aem - 我可以在CQ中制作一个简单的页面吗?

osgi - 无法在 CQ5 中发布 bundle

java - 从 REST 资源访问 Servlet 初始化参数

apache - 在远程软件配置系统的目标端使用 OSGi 有哪些优点?

amazon-s3 - 将AEM配置为使用S3数据存储时,它将使蓝绿色部署更快吗?

OSGI:当调用一个已经很忙的服务时会发生什么?

java - 如何从OSGI包中调用方法?

javascript - 使用 JavaScript 模拟文件上传表单

java - 尝试联机查看已部署的 JSP 页面。 XAMP/Tomcat

hadoop - Cloudera中的Hive Server快速入门