この会話は、活動がないためロックされています。新しい投稿を作成してください。
この会話は、活動がないためロックされています。新しい投稿を作成してください。
My problem is similar to the one described here: AEM 6.4 - Java sling servlet does not work with uber 6.4 jar, but does with uber 6.3
I have the following Servlet:
@Component(service=Servlet.class,
property={
Constants.SERVICE_DESCRIPTION + "=Video servlet",
"sling.servlet.methods=" + HttpConstants.METHOD_POST,
"sling.servlet.paths="+ "/bin/damUpload/video"
}
)
public class VideoServlet extends SlingAllMethodsServlet {
// ...
@Override protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
System.out.println("POST TO /bin/damUpload/video");
// ...
When I do a POST to localhost:4502/bin/damUpload/video, I get a 500 error:
18.05.2018 14:47:24.020 *ERROR* [0:0:0:0:0:0:0:1 [1526676444017] POST /bin/damUpload/video HTTP/1.1] org.apache.sling.servlets.post.impl.operations.ModifyOperation Unable to create resource named damUpload in /bin
18.05.2018 14:47:24.020 *ERROR* [0:0:0:0:0:0:0:1 [1526676444017] POST /bin/damUpload/video HTTP/1.1] org.apache.sling.servlets.post.impl.operations.ModifyOperation Exception during response processing.
org.apache.sling.api.resource.PersistenceException: Unable to create node at /bin/damUpload
at org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider.create(JcrResourceProvider.java:480) [org.apache.sling.jcr.resource:3.0.8]
at org.apache.sling.resourceresolver.impl.providers.stateful.AuthenticatedResourceProvider.create(AuthenticatedResourceProvider.java:182) [org.apache.sling.resourceresolver:1.5.34]
at org.apache.sling.resourceresolver.impl.helper.ResourceResolverControl.create(ResourceResolverControl.java:381) [org.apache.sling.resourceresolver:1.5.34]
I don't see the output for the System.out.println in my stdout.log, so I don't think it ever gets hit.
My bundle appears to be installed and active, and my service appears to be registered:
解決済! 解決策の投稿を見る。
Yours imports are fine. could you please try to invoke simple servlet with Get method for testing, to check whether issue is with code or something else.
@Component(service=Servlet.class,
property={
Constants.SERVICE_DESCRIPTION + "=Simple Demo Servlet",
"sling.servlet.methods=" + HttpConstants.METHOD_POST,
"sling.servlet.paths="+ "/bin/damUpload/video",
})
public class SimplePostServlet extends SlingAllMethodsServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void doGet(final SlingHttpServletRequest req,
final SlingHttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/plain");
resp.getWriter().write("Servlet found!");
System.out.println("Servlet found!");
}
}
I think I'm using the new osgi annotation. I have also tried the solution in Jorg's answer on the related post before asking this question.
My imports for the servlet are these:
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.jcr.api.SlingRepository;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import java.io.IOException;
import javax.jcr.Session;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import org.apache.sling.api.servlets.HttpConstants;
import org.osgi.framework.Constants;
These are in my pom file:
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.scr</artifactId>
<version>1.6.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.scr.annotations</artifactId>
<version>1.9.6</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>biz.aQute</groupId>
<artifactId>bndlib</artifactId>
<version>1.50.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
<version>4.2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.service.component.annotations</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.service.metatype.annotations</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.annotation</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.compendium</artifactId>
<version>4.2.0</version>
<scope>provided</scope>
</dependency>
表示
返信
いいね!の合計
Yours imports are fine. could you please try to invoke simple servlet with Get method for testing, to check whether issue is with code or something else.
@Component(service=Servlet.class,
property={
Constants.SERVICE_DESCRIPTION + "=Simple Demo Servlet",
"sling.servlet.methods=" + HttpConstants.METHOD_POST,
"sling.servlet.paths="+ "/bin/damUpload/video",
})
public class SimplePostServlet extends SlingAllMethodsServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void doGet(final SlingHttpServletRequest req,
final SlingHttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/plain");
resp.getWriter().write("Servlet found!");
System.out.println("Servlet found!");
}
}
I have created a servlet with the above the code mentioned by you, I have also build it successfully, when I accessed the page:http://localhost:/bin/damUpload/videohttp://localhost:8502/bin/damUpload/video, I found the message "servlet found!"
I am making a post call using the code:
$.post(
"/content/we-retail/ca/fr/jcr:content/",
{variableName : value},
function(result) {
window.alert('Here is your result : <strong>' + result + '</strong>');
}
);
it is creating a node and writing the data to the node's property without a servlet. I think it making use of defaultPostServlet, but how can I make a call to this custom servlet?
表示
返信
いいね!の合計
Shaheen ,
For the above code Arun provided , did you add doPost before testing POST call ?
表示
返信
いいね!の合計
Hi,
What is your action url? why are you making call to /content/we-retail/ca/fr/jcr:content/?
You should make a Ajax call to /bin/damUpload/video
e.g.
$.post(
"/bin/damUpload/video",
{variableName : value},
function(result) {
window.alert('Here is your result : <strong>' + result + '</strong>');
}
);
表示
返信
いいね!の合計
Sorry, my mistake, I dint mention it clearly.
My first query is:
When I am using this code:
$.post(
"/content/we-retail/ca/fr/jcr:content/",
{variableName : value},
function(result) {
window.alert('Here is your result : <strong>' + result + '</strong>');
}
);
, in a ".js" file,
the data gets persisted to the node at this path, without a servlet. I am not sure how that is happening. Is there any default servlet provided by AEM which is being used?
表示
返信
いいね!の合計
No, I just added the exact code and made a call like:
$.get(
"/bin/damUpload/video",
{comment : comment},
function(result) {
window.alert('Here is your result : <strong>' + result + '</strong>');
}
);
it works, but when I changed the path to :/content/we-retail/ca/fr/jcr:content, it stopped working.
表示
返信
いいね!の合計
Obviously, this is the expected behaviour in this case , as you are actually doing a "POST" to a resource path. If the resource path points to a custom servlet , or has a servlet registered for its resourceType , then your custom servlet will be executed. Otherwise it will be treated a default POST call and all your data will get saved to the node you mentioned.