Search code examples
javamavenjerseyejb

AbstractMethodError: javax.ws.rs.core.UriBuilder.uri in REST, EJB Application


I have troubles with my pom.xml file. I know, there is many topics about this issue, but any of them answers my problem.

@Path("/actors")
public class MainController {

    @EJB
    private ActorDaoLocal actorDao;  

}

@Local
public interface ActorDaoLocal { 
  //some stuff here
}

@Stateless
public class ActorDao implements ActorDaoLocal {

  @PersistenceContext
  private EntityManager em ; 
  //some stuff here 
}

@ManagedBean(name = "ActorBean")
@ApplicationScoped
public class ActorBean {

    @EJB
    private ActorDaoLocal usersDao;

}

In my application, when I haven't annotations in ActorBean as follows:

@ManagedBean(name = "ActorBean")
@ApplicationScoped 

actorDao is null in MainController

However, when I added this annotation and dependencies for it I am obtaining Exceptions:

java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;
    at javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.java:119)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:651)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

My pom.xml:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
    <type>jar</type>
</dependency>
<dependency>
    <groupId>asm</groupId>
    <artifactId>asm</artifactId>
    <version>3.1</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>
    <version>1.9.2</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-jaxrs</artifactId>
    <version>1.9.2</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.2</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-xc</artifactId>
    <version>1.9.2</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.18</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.18</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.18</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.18</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>1.18</version>
</dependency>
<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>jsr311-api</artifactId>
    <version>1.1.1</version>
</dependency>
<dependency>
    <groupId>javax.ejb</groupId>
    <artifactId>ejb-api</artifactId>
    <version>3.0</version>
</dependency>
<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>eclipselink</artifactId>
    <version>2.5.2</version>
</dependency>
<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <type>jar</type>
</dependency>

Please help me correct this, I can't find mistake in my pom file.

I am working at Tomcat 8


Solution

  • You have multiple dependencies in your classpath that contains javax.ws.rs.core.UriBuilder, two of JAX-RS 1.1:

    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>jsr311-api</artifactId>
        <version>1.1.1</version>
    </dependency>
    

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-core</artifactId>
        <version>1.18</version>
    </dependency>
    

    And one of JAX-RS 2.0:

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
    </dependency>
    

    Since JAX-RS 2.0 is from Java EE 7, probably you need downgrade javaee-api to version 6, using like this:

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>6.0</version>
    </dependency>
    

    Other way is upgrade Jersey version, like in this answer: AbstractMethodError using UriBuilder on JAX-RS

    In runtime UriBuilder#uri(String) is called, so you need to verify the dependencies in the servlet container.