Java JBoss、RestEasy、Spring依赖项注入失败

Java JBoss、RestEasy、Spring依赖项注入失败,java,spring,jboss7.x,resteasy,Java,Spring,Jboss7.x,Resteasy,我正要放弃JBoss,回到Tomcat,但我想在跳船之前,我会问一下stackoverflow的智慧世界。很抱歉,这里将粘贴大量代码/xml/日志。我一定错过了一些简单的东西 我在JBoss7.1.1上启动了一个新的Resteasy项目,目前有两个端点,如下所示 @Named @Path("/v1/users") @Produces(MediaType.APPLICATION_JSON) public class UserResource { @Inject private U

我正要放弃JBoss,回到Tomcat,但我想在跳船之前,我会问一下stackoverflow的智慧世界。很抱歉,这里将粘贴大量代码/xml/日志。我一定错过了一些简单的东西

我在JBoss7.1.1上启动了一个新的Resteasy项目,目前有两个端点,如下所示

@Named
@Path("/v1/users")
@Produces(MediaType.APPLICATION_JSON)
public class UserResource {

    @Inject
    private UserService userService;

    @GET
    public Response getUsers() {
        User user = new User();
        user.setUsername("someUsername");
        user.setEmail("user@gmail.com");
        user.setPassword("thepassword");
        Response.ResponseBuilder responseBuilder = Response.ok(user);

        return responseBuilder.build();
    }

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response createUser(User user) {
        Response.ResponseBuilder responseBuilder = null;

        try {
            userService.register(user);
            responseBuilder = Response.created(null);
        } catch (UserException ue) {
            if (ue.getMessage().equals(ErrorCode.USER_REGISTRATION_FIELD_MISSING)) {
                responseBuilder = Response.status(Response.Status.fromStatusCode(422));
                responseBuilder.entity(ue.getMessage());
            } else {
                responseBuilder = Response.serverError();
                responseBuilder.entity(ue.getMessage());
            }
        }

        return responseBuilder.build();
    }
}
@Get/v1/users工作正常。我的问题是userService没有被注入,在userService.register(user)调用中调用@POST/v1/users时,我得到了NullPointerException。下面是堆栈跟踪

17:17:05,669 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/api].[Resteasy]] (http--127.0.0.1-8080-1) Servlet.service() for servlet Resteasy threw exception: org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException
at org.jboss.resteasy.core.SynchronousDispatcher.handleApplicationException(SynchronousDispatcher.java:340) [resteasy-jaxrs-2.3.2.Final.jar:]
... JBoss/Resteasy attempting to handle exception, left out to reduce bloat

Caused by: java.lang.NullPointerException
at au.com.codecave.api.UserResource.createUser(UserResource.java:48) [classes:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_25]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_25]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_25]
at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_25]
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:155) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:257) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:222) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:211) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:525) [resteasy-jaxrs-2.3.2.Final.jar:]
... 19 more
我按照这个步骤设置了web.xml,并像往常一样设置了context.xml文件

Web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <!-- Auto scan for REST services ad providers -->
    <context-param>
        <param-name>resteasy.scan</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>resteasy.scan.providers</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/bizniz-context.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
    </listener>
    <listener>
        <listener-class>org.jboss.resteasy.plugins.spring.SpringContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>Resteasy</servlet-name>
        <servlet-class>
            org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
        </servlet-class>
    </servlet>

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

</web-app>
我在启动日志中没有看到任何关于实例化任何bean的异常,因此我认为这不是问题所在,我看到下面的消息,我认为这意味着Spring已正确初始化

17:16:46,003 INFO  [org.springframework.beans.factory.support.DefaultListableBeanFactory] (MSC service thread 1-4) Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@54287575: defining beans [userDaoImpl,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,dataSource,jdbcTemplate,userServiceImpl,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy
17:16:46,121 INFO  [org.springframework.web.context.ContextLoader] (MSC service thread 1-4) Root WebApplicationContext: initialization completed in 783 ms
我整天都在网上搜寻解决方案,但似乎找不到。版本详情如下

JBossAS7.1.1 Spring 3.2.8.RELEASE(Was 4但resteasy引导仅适用于3) Resteasy spring 3.0.8.1决赛


如果需要更多信息,请告诉我。谢谢大家。

不确定这是否是问题所在,但在JEE环境中初始化JAX-RS只需要很少的手动配置。您不需要在web.xml中配置servlet(这将使其在非JEE环境(如Tomcat)中工作),而只需要这样一个应用程序类:

@ApplicationPath("/REST")  
public class JaxrsApplication extends Application {  
}
此类(用ApplicationPath和扩展应用程序注释)的存在将触发JBoss初始化JAX-RS子系统。当然,你可以随意命名它,并将它映射到你想要的任何URL

文件:


但是我看到您使用了Spring,这让我怀疑我在这里所说的是否是全部事实。

我也有同样的空指针异常问题

步骤1: 不要使用SpringContextLoaderListener,而是尝试web.xml中spring框架中的默认ContextLoaderListener

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

org.springframework.web.context.ContextLoaderListener
步骤2: 在POM文件中添加以下2个依赖项:

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.0.RELEASE</version>
</dependency>

<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-spring</artifactId>
<version>3.0.4.Final</version>
</dependency>

org.springframework
spring上下文
4.2.0.1发布
org.jboss.resteasy
轻松的春天
3.0.4.4最终版本
步骤3: 在bizniz-context.xml中,将下面的bean定义添加到组件扫描之上

 <bean class="org.jboss.resteasy.plugins.spring.SpringBeanProcessorServletAware"/>


希望这能有所帮助。

谢谢您的回复。JAX-RS似乎已正确初始化,@GET端点工作正常。我认为resteasyservlet为我负责初始化。不管怎样,我还是尝试了你的建议,但最终还是得到了NullPointerException。出于某种原因,Spring似乎正确地实例化了所有bean,但它们似乎没有被注入到任何地方。然后,我宁愿在Spring领域寻找问题,而不是JBoss/JAX-RS。抱歉,我在这方面无能为力:(无论如何servlet不是解决问题的方法,我发布的是JBoss官方文档中的内容。很好,感谢您的尝试!servlet也来自JBoss官方文档(问题中的JBoss文档链接)。这两种方法似乎对我来说都适用于非spring集成端点。问题肯定出在spring和JBoss之间的连接上。
SpringContextLoaderListener
应该根据我的理解将spring连接到应用程序中,因此我可能在某个地方配置了错误的东西。我只是还找不到它。可能是这样线程可以提供一个线索,它似乎包含了相当完整的配置示例:我面临着同样的问题!!你能发布你是如何解决的吗?
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.0.RELEASE</version>
</dependency>

<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-spring</artifactId>
<version>3.0.4.Final</version>
</dependency>
 <bean class="org.jboss.resteasy.plugins.spring.SpringBeanProcessorServletAware"/>