You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Liferay7 Rest Extender中自定义REST API无法生效问题

问题原因

你遇到的自定义API无法访问问题,核心是JAX-RS注册逻辑不符合Liferay 7的OSGi JAX-RS Whiteboard实现规则:

  • 你把所有接口方法都写在了Application子类本身,仅通过getSingletons()返回当前类实例的方式注册。这种写法下,Liferay集成的Apache CXF运行时只会识别绑定@ApplicationPath根路径的无@Path注解方法(也就是你能正常访问的working()接口),不会扫描当前类上其他带@Path注解的子路径方法,自然无法识别你后加的/morning、/demo、/dummy等自定义接口。
  • 这种把所有资源方法堆在Application类的写法本身也不符合JAX-RS规范的最佳实践,Liferay的JAX-RS实现对这种非标准写法兼容性很差。
修复方案

你可以任选以下一种方式修复:

方案1:最小改动修复(不拆分现有代码)

在ClickRestApplication类中额外重写getClasses()方法,将当前类显式注册为资源类,补充代码如下:

import java.util.HashSet;

// 类内部补充该方法
@Override
public Set<Class<?>> getClasses() {
    Set<Class<?>> resourceClasses = new HashSet<>();
    resourceClasses.add(ClickRestApplication.class);
    return resourceClasses;
}

重新部署模块后即可正常访问所有子路径接口。

方案2:Liferay官方推荐标准写法

将所有子路径接口拆分到独立的资源类中,通过OSGi组件属性绑定到当前REST应用,兼容性和可维护性更好:

  1. 精简原有ClickRestApplication类,移除所有业务接口方法,只保留应用基础配置:
@ApplicationPath("/greetings")
@Component(immediate = true, service = Application.class)
public class ClickRestApplication extends Application {
    // 留空即可,Liferay会自动扫描绑定到该路径的资源类
}
  1. 新建独立的资源类存放所有接口方法:
import org.osgi.service.component.annotations.Component;
import javax.ws.rs.*;

@Component(
    immediate = true,
    service = Object.class,
    property = {
        "osgi.jaxrs.resource=true",
        "osgi.jaxrs.application.base=/greetings"
    }
)
@Path("/")
public class GreetingResource {

    @GET
    @Produces("text/plain")
    public String working() {
        return "It works!";
    }

    @GET
    @Path("/morning")
    @Produces("text/plain")
    public String hello() {
        return "Good morning!";
    }

    @GET
    @Path("/morning/{name}")
    @Produces("text/plain")
    public String morning(
        @PathParam("name") String name,
        @QueryParam("drink") String drink) {

        String greeting = "Good Morning " + name;
        if (drink != null) {
            greeting += ". Would you like some " + drink + "?";
        }
        return greeting;
    }
    
    @GET
    @Path("/demo")
    @Produces("text/plain")
    public String verify() {
        return "Verify User!";
    }

    @GET
    @Path("/dummy")
    @Produces("text/plain")
    public String dummy() {
        return "Dummy Response";
    }
}
注意事项
  • 部署修改后的模块前,如果访问持续异常,可以先删除Liferay目录下osgi/state文件夹清空OSGi缓存,再重启服务,避免旧的类注册信息残留。
  • Liferay 7的REST接口默认上下文前缀是/o,所以最终接口访问路径格式为/o/greetings/xxx,不要漏掉前缀。

内容的提问来源于stack exchange,提问作者Code Master

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 03:51:19