如何解决maven中的java.lang.reflect.InvocationTargetException

时间:2013-10-01 07:33:00

标签: java rest maven

我的web-app在eclipse和Netbeas中正常工作,但是当我尝试在maven中执行包含依赖项后抛出异常。依赖是。

     <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-bundle-jaxrs</artifactId>
       <version>2.1.2</version>
     </dependency>

这种依赖关系我包括因为我正在使用 ResponseBuilderImpl builder = new ResponseBuilderImpl()
如果我删除了构建器和依赖项,那么它在maven中的工作,但当我包括然后它给出例外。这是我的休息样本休息代码。

       @Path("/{userId}/logout")
   @PUT
   public Response logout(@PathParam ("userId") String userId,@Context HttpServletRequest request,@Context HttpServletResponse response)throws ServletException, IOException 
   {
    ResponseBuilderImpl builder = new ResponseBuilderImpl();
    log.debug("request user id for logout::"+userId);
    MapUserLogin mapUserLogin=new MapUserLogin();
    mapUserLogin.removeMap(userId);
    log.debug("after remove userinformation from hashmap");

    System.out.print("LOGOUT SUCCESSFULLUY");
    builder.status(200).entity("SUCCESS");
    return builder.build();

   }

所以对于ResponseBuilderImpl我导入了导入org.apache.cxf.jaxrs.impl.ResponseBuilderImpl 如果我删除并只返回字符串类型然后它的工作,但当我使用上面的代码然后只有maven抛出异常异常是。

INFO: Deployed Application(path=C:\App\apache-tomee-jaxrs-1.5.2\webapps\Snefocaremaven)
Oct 01, 2013 10:51:10 AM org.apache.openejb.observer.ObserverManager fireEvent
SEVERE: error invoking org.apache.openejb.observer.ObserverManager$Observer@21d4f61d
java.lang.reflect.InvocationTargetException

1 个答案:

答案 0 :(得分:1)

除非您有充分的理由使用特定于CXF的ResponseBuilderImpl,否则应使用JAX-RS Response类的静态工厂方法来获取ResponseBuilder,例如

Response response = Response.status(200).entity("SUCCESS").build();

JAX-RS框架将使用内部机制来加载和初始化正确的实现。请注意,除非使用专有功能,否则在编译时不需要CXF依赖项。

<强>更新

ResponseBuilder partial = Response.status(200);

将创建一个可变的构建器实例,可以进一步修改。请注意,您还应该能够修改构建器上的状态。不幸的是(?)JAX-RS API没有“普通”工厂方法。我建议首先尝试以这种方式创建Response并检查它是否有效或是否存在更微妙的问题。

ResponseBuilder partial = Response.status(200); // mock status
ResponseBuilder filled = fillResponse(partial); // whatever the method is called
return filled.build();

然后你可以考虑重构以摆脱具有模拟状态的构建器的创建,例如将整个响应构建移动到知道实体和响应代码的方法中。