【问题标题】:RESTful services on AEMAEM 上的 RESTful 服务
【发布时间】:2016-03-29 13:19:57
【问题描述】:

我正在尝试在 AEM 上公开一些 RESTfull Web 服务。我已按照blog 中的说明进行操作。下面是我的服务类。像 /helloservice/sayhi 这样的简单请求可以完美运行,但是带有路径参数和查询参数的方法(/withparameter/{userid}/query?q=xyz&prod=abc)返回 404 错误页面。请帮我解决这个问题。

我正在使用 AEM 5.6 和 Java 7

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import com.foo.bar.service.SampleResource;

@Service
@Component(metatype=true)
@Path("/helloservice")
public class SampleResourceImpl implements SampleResource{

    @GET
    @Path("/sayhi")
    @Produces({MediaType.APPLICATION_JSON})
    public String helloWorld(){
        return "Hello World";
    }

    @GET
    @Path("/getoperation")
    @Produces({MediaType.TEXT_PLAIN})
    public String getServiceOperation(){
        return "Hello getoperation!";
    }

    @GET
    @Path("/withparameter/{userid}")
    @Produces({MediaType.TEXT_PLAIN})
    public String getWithParameter(@PathParam("userid") String userid){
        return "Path parameter : "+userid;
    }

    @GET
    @Path("/query")
    @Produces({MediaType.TEXT_PLAIN})
    public String getURLParameters(@QueryParam("q") String q, @QueryParam("prod") String prod){
        return "Query params : "+q+", "+prod;
    }

}

任何帮助表示赞赏,谢谢!

【问题讨论】:

标签: java rest jax-ws aem


【解决方案1】:

https://issues.apache.org/jira/browse/SLING-2192 正在讨论在基于 Apache Sling(包括 AEM)的系统中使用 JAX-RS。从那次讨论来看,https://github.com/wcm-io-caravan/caravan-jaxrs 在我看来是在 OSGi 环境中使用 JAX-RS 资源的好解决方案。该项目的集成测试在 Sling 上运行,因此它很有可能在 AEM 上运行。

【讨论】:

  • @Bertrand,这个讨论进展了吗?我有兴趣看看 Caravan 是否是最好的方法?
  • 不,SLING-2192 没有取得进展,我不记得 Sling 开发人员列表上有更多讨论。
  • @Bertrand Delacretaz,如何测试邮递员的localhost:4502/services/helloservice/sayhi url?
  • 您可以像测试任何其他 URL 一样测试该 URL,与您想用邮递员做的其他事情相比,没有什么特别的。默认情况下,它需要凭据,因此您需要提供这些凭据。
【解决方案2】:

这是对 Sling 架构的错误使用。

如果你想实现一些 RESTful 服务(通过路径查询等)你需要实现特定的resource provider

There 就是一个例子。您可能需要了解它背后的一些基本概念,但在 Sling 的世界中,它仍然比 JAX-RS 好 10 倍。

【讨论】:

    【解决方案3】:

    Cognifide 实施了称为 Knot.X 的替代解决方案。 它允许轻松编写微服务(和其他 API)。它是为 AEM 编写的,但可以与任何 CMS/CRM 一起使用。 信息、代码示例和文档可以在这里找到:http://knotx.io/

    【讨论】:

      【解决方案4】:

      我将参数作为查询字符串传递,然后使用 javax.ws.rs.core 中的“UriInfo”为我工作:

      @GET      
      @Path("/data")   
      @Produces({MediaType.APPLICATION_JSON})   
      
      public JSONArray getData(@Context UriInfo info) throws JSONException { 
      
          String path = info.getQueryParameters().getFirst("p");
          String nodename = info.getQueryParameters().getFirst("nn");
      

      【讨论】:

        【解决方案5】:

        默认情况下,AEM 上会阻止某些请求路径和方法。在配置中转到“Apache Sling Servlet/Script Resolver and Error Handler”以允许此/services,然后转到“Apache Sling Referrer Filter”以删除被阻止的 HTTP 方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-11
          • 1970-01-01
          相关资源
          最近更新 更多