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

WildFly 20.0.0.1中JAX-RS资源无法访问且@PostConstruct不执行求助

问题排查:WildFly中REST资源无法调用且@PostConstruct未执行

我有一个打包为EAR的REST应用,部署在WildFly-20.0.0.1上,日志显示REST应用和资源已被部署,但TestRestAPIEndpoint资源无法调用,且TestRestAPIContext的@PostConstruct方法未执行。


1. REST应用类(TestRestAPIContext)

import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

import application.interfaces.ApplicationContext;

@ApplicationPath("/restapi/*")
public class TestRestAPIContext extends Application {
    @EJB
    private ApplicationContext ejbApplicationContext;

    @PostConstruct
    public void onInit() {
        try {
            System.out.println("REST INIT!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public Set<Class<?>> getClasses() {
        return new LinkedHashSet<>(Arrays.asList(TestRestAPIEndpoint.class));
    }
}

2. REST资源类(TestRestAPIEndpoint)

import javax.ejb.Stateless;
import javax.ws.rs.GET;
import javax.ws.rs.Path;

import engine.annotations.RestAPIMethod;

@Stateless
@Path("/endpoint")
public class TestRestAPIEndpoint {
    @GET
    @Path("/testme")
    @RestAPIMethod
    public String testAPI() {
        return "OK";
    }
}

3. EAR描述文件(META-INF/application.xml)

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/application_7.xsd" version="7">
  <display-name>application-framework-ear</display-name>
  <module>
    <web>
      <web-uri>application-framework-web.war</web-uri>
      <context-root>/application-framework</context-root>
    </web>
  </module>
  <module>
    <ejb>application-framework-ejb.jar</ejb>
  </module>
  <library-directory>libs</library-directory>
</application>

4. JBoss Web配置(application-framework-web.war/WEB-INF/jboss-web.xml)

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
    <context-root>/application-framework</context-root>
    <resource-ref>
        <res-ref-name>jdbc/application-framework-ds</res-ref-name>

        <jndi-name>java:/jdbc/datasource</jndi-name>
    </resource-ref>
</jboss-web>

5. Web应用配置(application-framework-web.war/WEB-INF/web.xml)

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <context-param>
        <param-name>isLog4jAutoInitializationDisabled</param-name>
        <param-value>true</param-value>
    </context-param>
<!--<servlet>-->
<!--<servlet-name>engine.TestRestAPIContext</servlet-name>-->
<!--<load-on-startup>1</load-on-startup>-->
<!--</servlet>-->

<!--<servlet-mapping>-->
<!--<servlet-name>engine.TestRestAPIContext</servlet-name>-->
<!--<url-pattern>/restapi/*</url-pattern>-->
<!--</servlet-mapping>-->
    <resource-ref>
        <description>Application Framework Datasource</description>
        <res-ref-name>jdbc/application-framework-ds</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>
</web-app>

注:web.xml中的Servlet配置已注释,希望仅通过注解完成配置。

部署日志

RESTEASY002225: Deploying javax.ws.rs.core.Application: class
engine.TestRestAPIContext RESTEASY002200: Adding class resource
engine.TestRestAPIEndpoint from Application class
engine.TestRestAPIContext


解决建议

  • 修正@ApplicationPath路径格式:@ApplicationPath("/restapi/*")写法错误,JAX-RS的@ApplicationPath不需要通配符*,改为@ApplicationPath("/restapi"),WildFly的RESTEasy实现对路径格式严格,带*会导致路径匹配异常。
  • 为REST应用类添加生命周期注解:TestRestAPIContext没有CDI或EJB注解,导致@PostConstruct无法触发、@EJB注入失效。可添加@ApplicationScoped(CDI)或@Stateless(EJB)注解,确保生命周期回调和依赖注入正常工作。
  • 检查资源类部署位置:TestRestAPIEndpoint是@Stateless EJB,当前在application-framework-ejb.jar中,RESTEasy默认仅扫描WAR包资源类。可将其移至WAR包,或确保EAR模块关联正确、REST应用类能正确引用该类。
  • 验证请求URL:修正路径后,正确请求URL应为http://<host>:<port>/application-framework/restapi/endpoint/testme,确认上下文根、应用路径和资源路径无误。
  • 启用CDI扫描(可选):若WAR包无beans.xml,添加application-framework-web.war/WEB-INF/beans.xml(空文件即可),设置bean-discovery-mode="all",确保CDI容器扫描到REST相关类。

内容的提问来源于stack exchange,提问作者Francesco Rizzi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:07:01