【问题标题】:Jetty embedded + Jersey + WeldJetty 嵌入式 + 球衣 + 焊接
【发布时间】:2022-11-23 23:21:37
【问题描述】:

我正在尝试(在 Java SE 中)实现一个独立的嵌入式 Web 服务器,公开具有 CDI 支持的 REST 应用程序。

我在这个链接 https://techunity.de/blog/integrate-a-rest-service-into-a-standalone-java-application/ 上学习了一个简单的教程,但我不想使用 OpenAPI,只想使用简单的 JAX-RS 资源类。

我按如下方式设置 Gradle,具有所有必需的依赖项:

plugins {
    id 'application'
    id 'java'
    id 'eclipse'
}

repositories {
    mavenCentral()
}

dependencies {
    // Use JUnit Jupiter for testing.
    testImplementation 'org.junit.jupiter:junit-jupiter:5.7.2'

    // This dependency is used by the application.
    implementation 'org.slf4j:slf4j-api:2.0.4'
    implementation 'ch.qos.logback:logback-classic:1.4.5'

    implementation 'jakarta.enterprise:jakarta.enterprise.cdi-api:3.0.1'
    implementation 'jakarta.ws.rs:jakarta.ws.rs-api:3.0.1'

    implementation 'org.jboss.weld.se:weld-se-core:5.1.0.Final'
    implementation 'org.jboss.weld.servlet:weld-servlet-core:5.1.0.Final'

    implementation 'org.eclipse.jetty:jetty-server:11.0.12'
    implementation 'org.eclipse.jetty:jetty-servlet:11.0.12'

    implementation 'org.glassfish.jersey.core:jersey-server:3.1.0'
    implementation 'org.glassfish.jersey.containers:jersey-container-servlet-core:3.1.0'
    implementation 'org.glassfish.jersey.ext.cdi:jersey-cdi1x:3.1.0'
    implementation 'org.glassfish.jersey.ext.cdi:jersey-cdi1x-servlet:3.1.0'
    implementation 'org.glassfish.jersey.ext.cdi:jersey-weld2-se:3.1.0'
    implementation 'org.glassfish.jersey.inject:jersey-hk2:3.1.0'
    implementation 'org.glassfish.jersey.media:jersey-media-json-jackson:3.1.0'

    implementation 'com.fasterxml.jackson.core:jackson-core:2.12.7'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.7'
}

application {
    // Define the main class for the application.
    mainClass = 'it.gym.StartApp'
}

tasks.named('test') {
    // Use JUnit Platform for unit tests.
    useJUnitPlatform()
}

然后我创建了主类:

package it.gym;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.glassfish.jersey.servlet.ServletContainer;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.jboss.weld.environment.servlet.Listener;
import org.jboss.weld.environment.servlet.WeldServletLifecycle;

public class StartApp {

    public static void main(String[] args) {
        Weld weld = new Weld();
        WeldContainer container = weld.initialize();

        final Server server = new Server(9000);
        final ServletContextHandler context = new ServletContextHandler(
                ServletContextHandler.SESSIONS);
        context.setContextPath("/");

        context.addEventListener(Listener.using(weld));
        context.setAttribute(
                WeldServletLifecycle.BEAN_MANAGER_ATTRIBUTE_NAME,
                container.getBeanManager());

        final ServletHolder servletHolder = new ServletHolder(
                ServletContainer.class);
        servletHolder.setInitOrder(1);
        servletHolder.setInitParameter(
                "jersey.config.server.provider.packages",
                "it.gym");

        context.addServlet(servletHolder, "/rest/*");

        server.setHandler(context);

        try {
            server.start();
            server.join();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

然后我创建了一个资源类和一个 bean 类:

package it.gym.rest;

import java.util.List;

import it.gym.dao.GymDAO;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.Status;

@Path("/")
@RequestScoped
public class GymEndpoint {

    @Inject
    private GymDAO gymDAO;
    
    @GET
    @Path("/test")
    public Response test() {
        List<String> entity = gymDAO.getDevices();
        return Response.status(Status.OK).entity(entity).build();
    }
}
package it.gym.dao;

import java.util.ArrayList;
import java.util.List;

import jakarta.enterprise.context.RequestScoped;

@RequestScoped
public class GymDAO {

    public GymDAO() {

    }
    
    public List<String> getDevices() {
        return new ArrayList<>();
    }
}

当我启动服务器时,出现以下错误。似乎没有找到 GymDAO 类作为 CDI 类,忽略 @RequestScoped 注解。谁能弄清楚我错过了什么?

jakarta.servlet.ServletException: org.glassfish.jersey.servlet.ServletContainer-15eebbff==org.glassfish.jersey.servlet.ServletContainer@60d52d52{jsp=null,order=1,inst=true,async=true,src=EMBEDDED:null,STARTED}
        at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:651)
        at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:415)
        at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$2(ServletHandler.java:725)
        at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310)
        at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735)
        at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
        at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:749)
        at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:392)
        at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:901)
        at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:306)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:171)
        at org.eclipse.jetty.server.Server.start(Server.java:470)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)
        at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:89)
        at org.eclipse.jetty.server.Server.doStart(Server.java:415)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93)
        at it.gym.StartApp.main(StartApp.java:40)
Caused by: org.jboss.weld.exceptions.IllegalArgumentException: WELD-001408: Unsatisfied dependencies for type GymDAO with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject private it.gym.rest.GymEndpoint.gymDAO
  at it.gym.rest.GymEndpoint.gymDAO(GymEndpoint.java:0)

        at org.jboss.weld.manager.InjectionTargetFactoryImpl.createInjectionTarget(InjectionTargetFactoryImpl.java:83)
        at org.jboss.weld.manager.InjectionTargetFactoryImpl.createInjectionTarget(InjectionTargetFactoryImpl.java:70)
        at org.jboss.weld.manager.InjectionTargetFactoryImpl.createInjectionTarget(InjectionTargetFactoryImpl.java:51)
        at org.glassfish.jersey.ext.cdi1x.internal.AbstractCdiBeanSupplier$2.<init>(AbstractCdiBeanSupplier.java:83)
        at org.glassfish.jersey.ext.cdi1x.internal.AbstractCdiBeanSupplier.<init>(AbstractCdiBeanSupplier.java:79)
        at org.glassfish.jersey.ext.cdi1x.internal.GenericCdiBeanSupplier.<init>(GenericCdiBeanSupplier.java:37)
        at org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider.bind(CdiComponentProvider.java:225)
        at org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider.bind(CdiComponentProvider.java:182)
        at org.glassfish.jersey.ext.cdi1x.internal.CdiServerComponentProvider.bind(CdiServerComponentProvider.java:50)
        at org.glassfish.jersey.server.ResourceModelConfigurator.bindWithComponentProvider(ResourceModelConfigurator.java:193)
        at org.glassfish.jersey.server.ResourceModelConfigurator.bindProvidersAndResources(ResourceModelConfigurator.java:150)
        at org.glassfish.jersey.server.ResourceModelConfigurator.init(ResourceModelConfigurator.java:63)
        at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:359)
        at org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$1(ApplicationHandler.java:310)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
        at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:232)
        at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:309)
        at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:274)
        at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311)
        at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:154)
        at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:338)
        at jakarta.servlet.GenericServlet.init(GenericServlet.java:178)
        at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:633)
        ... 20 more
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type GymDAO with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject private it.gym.rest.GymEndpoint.gymDAO
  at it.gym.rest.GymEndpoint.gymDAO(GymEndpoint.java:0)

        at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:367)
        at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:285)
        at org.jboss.weld.bootstrap.Validator.validateProducer(Validator.java:414)
        at org.jboss.weld.injection.producer.InjectionTargetService.validateProducer(InjectionTargetService.java:36)
        at org.jboss.weld.manager.InjectionTargetFactoryImpl.validate(InjectionTargetFactoryImpl.java:153)
        at org.jboss.weld.manager.InjectionTargetFactoryImpl.createInjectionTarget(InjectionTargetFactoryImpl.java:81)
        ... 43 more
14:27:02.984 [Thread-0] INFO org.jboss.weld.Bootstrap - WELD-ENV-002001: Weld SE container 944b54c2-e094-44a2-ba2b-0ae8d247d9aa shut down
Weld SE container 944b54c2-e094-44a2-ba2b-0ae8d247d9aa shut down by shutdown hook

【问题讨论】:

    标签: java jersey embedded-jetty weld


    【解决方案1】:

    我刚刚尝试使用 Grizzly,它的效果非常好。

    这里 gradle conf 文件:

    plugins {
        id 'application'
        id 'java'
        id 'eclipse'
    }
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        // Use JUnit Jupiter for testing.
        testImplementation 'org.junit.jupiter:junit-jupiter:5.7.2'
    
        // This dependency is used by the application.
        implementation 'org.slf4j:slf4j-api:2.0.4'
        implementation 'ch.qos.logback:logback-classic:1.4.5'
    
        implementation 'jakarta.enterprise:jakarta.enterprise.cdi-api:3.0.1'
        implementation 'jakarta.ws.rs:jakarta.ws.rs-api:3.0.1'
    
        implementation 'org.jboss.weld.se:weld-se-core:5.1.0.Final'
        implementation 'org.jboss.weld.servlet:weld-servlet-core:5.1.0.Final'
    
        implementation 'org.glassfish.grizzly:grizzly-http-server:4.0.0'
    
        implementation 'org.glassfish.jersey.core:jersey-server:3.1.0'
        implementation 'org.glassfish.jersey.containers:jersey-container-grizzly2-http:3.1.0'
        implementation 'org.glassfish.jersey.ext.cdi:jersey-weld2-se:3.1.0'
        implementation 'org.glassfish.jersey.inject:jersey-hk2:3.1.0'
        implementation 'org.glassfish.jersey.media:jersey-media-json-jackson:3.1.0'
    
        implementation 'com.fasterxml.jackson.core:jackson-core:2.12.7'
        implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.7'
    }
    
    application {
        // Define the main class for the application.
        mainClass = 'it.gym.StartApp'
    }
    
    tasks.named('test') {
        // Use JUnit Platform for unit tests.
        useJUnitPlatform()
    }
    

    和主要课程:

    package it.gym;
    
    import java.net.URI;
    
    import org.glassfish.grizzly.http.server.HttpServer;
    import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
    import org.glassfish.jersey.server.ResourceConfig;
    import org.jboss.weld.environment.se.Weld;
    
    public class StartApp {
    
        public static void main(String[] args) {
            Weld weld = new Weld();
            weld.initialize();
    
            ResourceConfig resourceConfig = new ResourceConfig();
            resourceConfig.packages("it.gym");
    
            final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create("http://localhost:9000/"),
                    resourceConfig);
    
            try {
                Thread.sleep(1000 * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            server.shutdownNow();
            weld.shutdown();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 2013-12-25
      • 1970-01-01
      • 2016-02-22
      相关资源
      最近更新 更多