RESTful Java Web应用程序中的Hadoop - 冲突的URI模板

时间:2012-02-24 20:37:53

标签: java rest hadoop web hdfs

我有一个小型Java Web应用程序,我在其中使用Jersey 1.12和Hadoop 1.0.0 JAR文件(hadoop-core-1.0.0.jar)。当我将我的应用程序部署到JBoss 5.0服务器时,日志文件会记录以下错误:

SEVERE: Conflicting URI templates. The URI template / for root resource class   
org.apache.hadoop.hdfs.server.namenode.web.resources.NamenodeWebHdfsMethods and the URI  
template / transform to the same regular expression (/.*)?

为了确保我的代码不是问题,我创建了一个新的Web应用程序,其中只包含Jersey和Hadoop JAR文件以及一个小存根。我的web.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"   
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
   <servlet>
    <servlet-name>ServletAdaptor</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-  class>
    <load-on-startup>1</load-on-startup>
   </servlet>
   <servlet-mapping>
    <servlet-name>ServletAdaptor</servlet-name>
    <url-pattern>/mytest/*</url-pattern>
   </servlet-mapping>    
   <session-config>
    <session-timeout>
        30
    </session-timeout>
   </session-config>
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
</web-app>

我的简单RESTful存根如下:

import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.Path;

@Path("/mytest")
public class MyRest {

@Context
private UriInfo context;

  public MyRest() {
  }
}

在我的常规应用程序中,当我删除Hadoop JAR文件(以及使用Hadoop的代码)时,一切都按照我的预期运行。部署成功,其余RESTful服务正常运行。我也尝试过Hadoop 1.0.1 JAR文件,并且在NamenodeWebHdfsMethods类中遇到了与冲突的URL模板相同的问题。任何有关解决此问题的建议或提示都将不胜感激。

2 个答案:

答案 0 :(得分:3)

我通过添加init-params来修复问题,以指示Jersey ServletContainer仅搜索我在特定包中定义的资源(见下文)。

<servlet>
    <servlet-name>ServletAdaptor</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param> 
        <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name> 
        <param-value>com.sun.jersey.api.core.PackagesResourceConfig</param-value> 
    </init-param> 
    <init-param> 
        <param-name>com.sun.jersey.config.property.packages</param-name> 
        <param-value>org.test.myrest</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup>
</servlet>

答案 1 :(得分:0)

我遇到了类似的问题。产生这个问题是因为我改变了REST类的包。当GlassFish服务器启动时,它说已找到以前的类。在GlassFish v3的日志中,您可以找到“INFO:找到的根资源类:”行,您可能会看到重复。

现在,我正在寻求清理资源类。