繁体   English   中英

JBoss,RestEasy,Spring依赖项注入失败

[英]JBoss, RestEasy, Spring dependency injection failing

我将要放弃JBoss,然后回到Tomcat,但是我认为在跳船之前我会问一下stackoverflow的明智之举。 抱歉,这里会粘贴很多代码/ xml /日志。 我一定缺少一些简单的东西?

我已经在JBoss 7.1.1上启动了一个新的Resteasy项目,目前有2个端点,如下所示。

@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时出现NullPointerExceptions。 下面的堆栈跟踪

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

我按照此JBoss文档设置了我的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>

bizniz-的context.xml

<?xml version="1.0" encoding="UTF-8"?>
<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-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <import resource="persistence-context.xml" />
    <context:component-scan base-package="au.com.codecave.service"/>

</beans>

UserServiceImpl.java

@Named
public class UserServiceImpl implements UserService {

    private static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class);

    @Inject
    private UserDao userDao;

    @Override
    public User register(User user) throws UserException {

        if (StringUtils.isEmpty(user.getEmail()) || StringUtils.isEmpty(user.getEmail())) {
            log.error("Mandatory registration field was empty.  Email: {}, Username: {}", user.getEmail(), user.getUsername());
            throw new UserException(ErrorCode.USER_REGISTRATION_FIELD_MISSING.getMessage());
        }

        try {
            userDao.create(user);
        } catch (DataException de) {
            throw new UserException(de);
        }

        return user;
    }

我没有在启动日志中看到任何有关实例化任何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

我整天都在网上搜索以寻找解决方案,但似乎找不到。 下面的版本详细信息。

JBoss AS 7.1.1 Spring 3.2.8.RELEASE(以前是4,但意识到resteasy Bootstrap仅可用于3, 请参见此处的问题 )Resteasy-spring 3.0.8.Final

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

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

步骤1:代替使用SpringContextLoaderListener,请尝试从spring.web.xml中的默认ContextLoaderListener

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

步骤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>

步骤3:在bizniz-context.xml中,在component-scan上方添加以下bean定义

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

希望这可以帮助。

不确定是否是问题所在,但是在JEE环境中初始化JAX-RS几乎不需要手动配置。 无需在web.xml中配置servlet(这是为了使其在非JEE环境(例如Tomcat)上工作),您只需要像下面这样的Application类:

@ApplicationPath("/REST")  
public class JaxrsApplication extends Application {  
}

此类的存在(使用ApplicationPath和扩展Application进行注释)将触发JBoss初始化JAX-RS子系统。 根据需要命名,然后将其映射到所需的任何URL。

文档:

https://docs.jboss.org/author/display/AS7/JAX-RS+Reference+Guide

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM