我正要放弃JBoss,回到Tomcat,但我想在跳槽之前,我应该请教一下堆栈溢出的智慧世界。我很抱歉,因为这里会粘贴大量的代码/xml/日志。我一定漏掉了什么简单的东西?
我已经在JBoss 7.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.register( userService )调用@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 documentation设置了我的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 Spring3.2.8.RELEASE(是4,但实现了resteasy Bootstrap只适用于3 see issue here) Resteasy-spring 3.0.8最终
如果需要更多信息,请告诉我。谢谢大家。
发布于 2015-09-10 19:23:38
我遇到了类似的空指针异常问题。
Step1:不使用SpringContextLoaderListener,而是在web.xml中尝试spring框架中的默认ContextLoaderListener
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>Step2:在POM文件中添加以下两个依赖项:
<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>在bizniz-context.xml中,将下面的bean定义添加到Step3-scan之上
<bean class="org.jboss.resteasy.plugins.spring.SpringBeanProcessorServletAware"/>希望这能有所帮助。
发布于 2014-05-19 16:46:40
我不确定这是否是问题所在,但是在JEE环境中初始化JAX-RS只需要很少的手动配置。您只需要一个应用程序类,而不是在web.xml中配置servlet (这是为了让它在非JEE环境中工作,比如Tomcat):
@ApplicationPath("/REST")
public class JaxrsApplication extends Application {
}这个类(用ApplicationPath和扩展应用程序注释)的存在将触发JBoss初始化JAX-RS子系统。当然,您可以根据需要命名它,并将其映射到您想要的任何URL。
文档:
https://docs.jboss.org/author/display/AS7/JAX-RS+Reference+Guide
但是我看到你在使用Spring,这让我怀疑我在这里说的是不是全部的事实。
https://stackoverflow.com/questions/23732439
复制相似问题