01 d'Nick
01 d'Nick

Reputation: 86

RESTEasy annotation scan unable to find resources (under Tomcat)

I'm trying to update WAR with old RESTEasy 3.0.5 to something newer. 3.0.6 works fine, but after updating to 3.0.7 (or higher, like 3.0.24) all resources (@Path) are lost — 404 for any resource. WAR is run under Apache Tomcat server.

I believe the reason is linked to change of annotation scanner: https://issues.jboss.org/browse/RESTEASY-1010

I've tried to create class which extends javax.ws.rs.core.Application instead of web.xml configuration. According to answer https://stackoverflow.com/a/29957040/2528366, empty set should trigger scan for @Path but no any resource is found. If I override getClasses() which returns non-empty set, that resources work as expected.

web.xml: https://pastebin.com/uRD2w6Z6

New Application inherited class:

@ApplicationPath("/rest")
public class WebApi extends Application
{
    @Override
    public Set<Class<?>> getClasses()
    {
        Set<Class<?>> s = new HashSet<>();
        // if line below is uncommented SomeResource works fine
        // s.add(SomeResourceImpl.class);
        return s;
    }
}

Resources are interfaces and implementation is in derived classes. Moving annotations to classes itself changes nothing.

What's wrong with annotations or configuration? Or is there something else needed to trigger scanning for annotations?

Upvotes: 1

Views: 1223

Answers (1)

Dimitri
Dimitri

Reputation: 8280

If you are using a Tomcat version that is compatible with the Servlet 3.0 specification, you need to add the resteasy-servlet-initializer dependency :

    <dependency>
       <groupId>org.jboss.resteasy</groupId>
       <artifactId>resteasy-servlet-initializer</artifactId>
       <version>${resteasy.version}</version>
   </dependency>

As stated in the documentation :

Resteasy uses the ServletContainerInitializer integration interface in Servlet 3.0 containers to initialize an application, automatically scanning for resources and providers. To enable automatic scanning, you must also include the resteasy-servlet-initializer artifact in your WAR file as well

Upvotes: 1

Related Questions