我目前正在尝试设置我的第一个Java-EE(JDK8)应用程序,无法覆盖上下文根以使用@ApplicationPath注释。
使用的应用程序服务器是Wildfly 16.0.0.Final,我正在尝试将Resteasy用作JAX-RS实现。

由于我使用gradle作为战争来部署应用程序,因此这是我的依赖项:(这是一团糟,我试图弄清楚我真正需要什么,不需要什么,总是欢迎提出建议)

    dependencies {
    compileOnly 'org.jboss.logging:jboss-logging:3.3.0.Final'
    compileOnly 'org.apache.logging.log4j:log4j-api:2.8.2'
    compileOnly 'org.eclipse.persistence:javax.persistence:2.1.0'
    compileOnly 'javax.inject:javax.inject:1'
    compileOnly 'javax.transaction:javax.transaction-api:1.2'
    compileOnly 'javax.enterprise:cdi-api:2.0'
    compileOnly 'org.hibernate:hibernate-core:5.4.2.Final'
    compileOnly 'org.hibernate:hibernate-envers:5.4.2.Final'
    compileOnly 'com.fasterxml.jackson.core:jackson-core:2.9.8'
    compileOnly 'com.fasterxml.jackson.core:jackson-annotations:2.9.8'
    compileOnly 'com.fasterxml.jackson.core:jackson-databind:2.9.8'
    compileOnly 'javax.servlet:javax.servlet-api:3.1.0'
    compile group: 'org.jboss.resteasy', name: 'resteasy-jaxrs', version: '3.6.3.Final'
    compile group: 'org.jboss.resteasy', name: 'jaxrs-api', version: '3.0.12.Final'
}


我验证了wildfly正在使用适当版本的resteasy,并且还在使用3.6.3。

我的应用程序配置如下所示:

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import java.util.HashSet;
import java.util.Set;

@ApplicationPath("rest/*")
public class ApplicationConfig extends Application {
    // Intentionally empty. Just used to configure the application path for wildfly

    @Override
    public Set<Class<?>> getClasses() {
        final Set<Class<?>> s = new HashSet<>();
        s.add(HelloWorldController.class);
        return s;
    }

}


现在,我目前能够成功部署我的应用程序,但是上下文根仍然像这样设置为我的war文件的名称:

18:39:47,586 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 85) WFLYUT0021: Registered web context: '/Rest-Test-1.0' for server 'default-server'


当访问带有战争名称的URL时,我可以看到我的WebFilter的日志条目,但是在使用匹配的@Path注释将过滤器寻址到正确的Class时,过滤器也无法正确执行该链。是CDI的问题?)

更新1:
将@ApplicationPath更改为“ / rest”或“ rest”也不会更改上下文根注册。它仍然以战争名称为上下文根。

TL; DR:
为什么我的@ApplicationPath批注会被忽略,并且为什么我的webfilter无法链接请求?

解:


将依赖关系从resteasy更改为compileOnly


这消除了警告WELD-000167: Class org.jboss.resteasy.core.AsynchronousDispatcher is annotated with @RequestScoped but it does not declare an appropriate constructor therefore is not registered as a bean!


将ApplicationPath更改为正确的路径(“ / rest”)


这使我的URI正确地注册为root并启用了WebFilter来执行正确的链接,因为它现在可以与URI中的每个组件区分开。


将jboss-web.xml添加到WEB-INF


使用如下的jboss-web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web version="10.0"
           xmlns="http://www.jboss.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-web_10_0.xsd">

    <context-root>/api</context-root>
    <security-domain>other</security-domain> <!-- Configure to the security domain used for your deployed application -->
    <server-instance>default-server</server-instance>
    <virtual-host>default-host</virtual-host>

</jboss-web>


我能够将上下文根重写为更漂亮的根。

如果您的IDE指出server-instance元素错误,则可以忽略它,它仍然可以正常工作。

最佳答案

您可以使用application xml更改上下文根

07-26 06:25