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是@StatelessEJB,当前在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
相关产品推荐
相关产品推荐

