当前位置: 首页 > 知识库问答 >
问题:

使用Jersey Spring在Jersey中自动关联Spring依赖项时遇到问题

纪俊良
2023-03-14

我正在尝试使用Jersey Spring在Jersey应用程序中获取DI设置。但是,当我点击一个路由时,我得到500个错误,并看到下面的堆栈跟踪:

No beans found. Resolution failed for type class com.roommateAPI.service.HelloWorldService.
/RoommateAPI/hello/two
java.lang.NullPointerException
    at com.roommateAPI.resources.HelloWorldResource.helloWorldTwo(HelloWorldResource.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171)
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:195)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:406)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:350)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:106)
    at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:259)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:319)
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:236)
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1028)
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:219)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:440)
    at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
    at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:926)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
> Building > :jettyRun > Running at http://localhost:8080/RoommateAPI

从我所做的SO研究来看,我的Spring配置似乎没有被加载,但我不知道为什么。我使用的是基于Java的配置。

我的豆子

package com.roommateAPI.service;

import org.springframework.stereotype.Component;

@Component
public class HelloWorldService {

    public String sayHelloTwo() {
        return "Hello World 2!";
    }
}

我的资源

package com.roommateAPI.resources;

import com.roommateAPI.service.HelloWorldService;
import org.springframework.beans.factory.annotation.Autowired;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("hello")
public class HelloWorldResource {

    @Autowired
    HelloWorldService helloWorldService;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String helloWorld() {
        return "Hello world!";
    }

    //This is an example test using DI/mocking
    @GET
    @Path("/two")
    @Produces(MediaType.TEXT_PLAIN)
    public String helloWorldTwo() {
        return helloWorldService.sayHelloTwo();
    }
}

我的Java配置

package com.roommateAPI.config;

import com.roommateAPI.service.HelloWorldService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.roommateAPI.service")
public class SpringApplication {
    @Bean(name="hellowWorldService")
    public HelloWorldService helloWorldService() {
        return new HelloWorldService();
    }
}

泽西配置

package com.roommateAPI.config;

import com.roommateAPI.service.HelloWorldService;
import org.glassfish.jersey.server.ResourceConfig;

public class JerseyApplication extends ResourceConfig {

    public JerseyApplication() {
        register(HelloWorldService.class);
    }
}

web.xml

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
         version="2.4">

    <display-name>Roommate API</display-name>

    <module-name>roommateapi</module-name>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfiguration</param-name>
        <param-value>com.roommateAPI.config.SpringApplication</param-value>
    </context-param>

    <context-param>
        <param-name>contextClass</param-name>
        <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
    </context-param>

    <servlet>
        <servlet-name>JerseyServlet</servlet-name>                        co
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.roommateAPI.config.JerseyApplication</param-value>
        </init-param>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.roommateAPI.resources</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>JerseyServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

依赖关系

dependencies {
    appengineSdk 'com.google.appengine:appengine-java-sdk:1.9.5'
    compile 'org.glassfish.jersey.containers:jersey-container-servlet:2.6'
    compile 'org.glassfish.jersey.media:jersey-media-moxy:2.4.1'
    compile 'org.glassfish.jersey.ext:jersey-spring3:2.4'
    testCompile 'org.glassfish.jersey.test-framework:jersey-test-framework-core:2.9.1'
    testCompile 'org.mockito:mockito-all:1.9.5'
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

我尝试过的:

为此,我已经确保我有Spring ContextLoaderListener设置,以便Spring加载。

共有1个答案

乌翔
2023-03-14

我终于发现我不能通过web.xml.连接Java配置,所以我添加了一个应用程序Context.xml到我的WEB-INF目录,代码如下:

应用程序上下文。xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd"
        >

    <context:annotation-config/>
        <bean class="com.roommateAPI.config.SpringApplication"/>
        <!--<bean id="HelloWorldService" class="com.roommateAPI.service.HelloWorldService" />-->
    </beans>

然后我在我的Spring应用程序中遇到了另一个问题。java我有自动连接和@Bean声明,而Spring无法找出我想要的。因此,我的Java应用程序现在看起来如下所示:

web.xml

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
         version="2.4">

    <display-name>Roommate API</display-name>

    <module-name>roommateapi</module-name>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfiguration</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>JerseyServlet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.roommateAPI.config.JerseyApplication</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>JerseyServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

SpringApplication。JAVA

package com.roommateAPI.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.roommateAPI.service")
public class SpringApplication {

}
 类似资料:
  • 但它似乎都很好,文件夹结构是正确的。 您正在运行禁用SSL/TLS保护的Composer。正在加载包含包信息的composer存储库警告:通过http访问packagist.org,这是一种不安全的协议。更新依赖项(包括require dev)无法将您的需求解析为一组可安装的包。 我将php重新安装到C:/php,我将php.ini文件提取到C:/I中,我设置了环境变量,还取消了扩展名的注释

  • 依赖关系解析器绑定器注册在类中: ConfigInjectionResolver实现InjectionResolver并解析某些逻辑。 在循环中遍历描述并创建endpoint。为每个endpoint创建、填充资源生成器并注册资源。在endpoint资源的创建过程中,在Jackson-DataBind的帮助下实例化了一个类:

  • 我是一个Clojure和JVM初学者,构建工具对我来说有点混乱,所以请原谅我将要执行的愚蠢。我不知道“类路径”是什么...我只想要一个Lisp与许多库! 我使用启动项目,并且我的project.clj具有以下依赖项: 而来自my Core.clj的相关ns调用如下: 我的目录结构是leiningen用于新库的默认设置。 我在Java 1.8.0_45上使用Leiningen 2.5.1。我只是在学

  • 我试图画一个类图,但对于在类似下面的场景中使用的关联关系感到困惑。 在上面的示例中,Launcher类具有SampleInterface类型的状态变量interfaceImpl。我正在通过使用SpringSetter注入将SampleInterface的实现作为bean传递给初始化启动器类。bean的作用域是singleton。 同样的bean也通过spring传递给其他对象。 我的疑惑: 这种关

  • 因此,如果有人能给我提供一个工作示例,说明maven项目中的任何一种Spring-Sec3/Jersey2.2集成,我将不胜感激。 预付款感谢

  • 我正在尝试为我的Spring Boot应用程序配置加载时编织,以正确地自动连接对< code>@Configurable java类的依赖。 下面是我的配置/主类: 以下是我如何启动应用程序(我的 gradle 版本重命名为 spring-instrument jar): 下面是个不自动连接其依赖项的类: 这里的类被实例化(<鳕鱼 谁能请帮助弄清楚为什么<代码>字符串