0
votes

I am getting NoSuchMethod exception when I try to migrate existing endpoints version 1.o code to endpoints framework version 2.

I am using the guide in this url here

https://cloud.google.com/endpoints/docs/frameworks/java/migrating

but I keep getting this error message

java.lang.NoSuchMethodException: sampe-package-path.EndpointClassEndpoint.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.newInstance(Class.java:412)
    at com.google.api.server.spi.EndpointsServlet.createService(EndpointsServlet.java:143)
    at com.google.api.server.spi.EndpointsServlet.createSystemService(EndpointsServlet.java:128)
    at com.google.api.server.spi.EndpointsServlet.init(EndpointsServlet.java:57)

I have used the exact web.xml in the example on migrating here

https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/appengine/endpoints-frameworks-v2/migration-example/src/main/webapp/WEB-INF/web.xml

Could there be something I am missing out?

In the Endpoint class above I just have a single parameter constructor like this

@Inject
public EndpointClassEndpoint(EndpointClassContext context) {
    this.context = context;
}

I would appreciate any help to resolve this error

Adding the complete web.xml as requested by @saiyr

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <listener>
        <listener-class>
            somethpath.bootstrap.CompanyOneGSCL
        </listener-class>
    </listener>

 <listener>
        <listener-class>
            somethpath.bootstrap.listeners.ObjectifyLoaderContextListener
        </listener-class>
    </listener>

    <!-- GUICE -->
    <filter>
        <filter-name>guiceFilter</filter-name>
        <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>guiceFilter</filter-name>
        <url-pattern>/_ah/spi/*</url-pattern>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


    <!-- ENDPOINTS -->
    <servlet>
        <servlet-name>EndpointsServlet</servlet-name>
        <servlet-class>com.google.api.server.spi.EndpointsServlet</servlet-class>
        <init-param>
            <param-name>services</param-name>
            <param-value>
                somethpath.endpoints.PraxoneV1API,
                somethpath.endpoints.EmpresasEndpoint,
                csomethpath.endpoints.AdministrationEndpoint,
                somethpath.endpoints.CentrosEndpoint,
                somethpath.endpoints.CargosEndpoint,
                somethpath.endpoints.TrabajadoresEndpoint,
                somethpath.endpoints.EvaluacionEndpoint,
                somethpath.endpoints.EpidemiologiaEndpoint,
                somethpath.endpoints.ActividadEndpoint,
                somethpath.endpoints.TrabajadoresOpenEndpoint,
                somethpath.endpoints.AsyncJobEndpoint
            </param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
    <servlet-name>EndpointsServlet</servlet-name>
    <url-pattern>/_ah/api/*</url-pattern>
    </servlet-mapping>


    <!-- MonitorCompanyTask Servlet -->
    <servlet>
        <servlet-name>MonitorCompanyTask</servlet-name>
        <servlet-class>reducted-path.MonitorCompanyTask</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>MonitorCompanyTask</servlet-name>
        <url-pattern>/tasks/v1/monitor/company</url-pattern>
    </servlet-mapping>



    <!--servlet>
        <servlet-name>appstats</servlet-name>
        <servlet-class>com.google.appengine.tools.appstats.AppstatsServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>appstats</servlet-name>
        <url-pattern>/appstats/*</url-pattern>
    </servlet-mapping>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>appstats</web-resource-name>
            <url-pattern>/appstats/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>admin</role-name>
        </auth-constraint>
    </security-constraint -->

    <!-- All app must use HTTPS -->
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>any</web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>
</web-app>

When I do gradle dependencies this is what I get

+--- com.google.endpoints:endpoints-framework:2.0.8
|    +--- javax.servlet:servlet-api:2.5
|    +--- com.google.guava:guava:19.0 -> 20.0
|    +--- com.fasterxml.jackson.core:jackson-annotations:2.6.4 -> 2.9.0
|    +--- com.fasterxml.jackson.core:jackson-core:2.6.4 -> 2.9.6
|    +--- com.fasterxml.jackson.core:jackson-databind:2.6.4 -> 2.9.6
|    |    +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0
|    |    \--- com.fasterxml.jackson.core:jackson-core:2.9.6
|    +--- com.google.appengine:appengine-api-1.0-sdk:1.9.49 -> 1.9.64
|    +--- com.google.http-client:google-http-client-jackson2:1.21.0 -> 1.23.0
|    |    +--- com.google.http-client:google-http-client:1.23.0
|    |    |    +--- com.google.code.findbugs:jsr305:1.3.9 -> 3.0.1
|    |    |    \--- org.apache.httpcomponents:httpclient:4.0.1 -> 4.5.2
|    |    |         +--- org.apache.httpcomponents:httpcore:4.4.4
|    |    |         +--- commons-logging:commons-logging:1.2
|    |    |         \--- commons-codec:commons-codec:1.9 -> 1.10
|    |    \--- com.fasterxml.jackson.core:jackson-core:2.1.3 -> 2.9.6
|    +--- com.google.api-client:google-api-client:1.21.0 -> 1.23.0
|    |    +--- com.google.oauth-client:google-oauth-client:1.23.0
|    |    |    +--- com.google.http-client:google-http-client:1.23.0 (*)
|    |    |    \--- com.google.code.findbugs:jsr305:1.3.9 -> 3.0.1
|    |    +--- com.google.http-client:google-http-client-jackson2:1.23.0 (*)
|    |    \--- com.google.guava:guava-jdk5:17.0
|    +--- com.google.api-client:google-api-client-appengine:1.21.0 -> 1.23.0
|    |    +--- com.google.oauth-client:google-oauth-client-appengine:1.23.0
|    |    |    +--- com.google.http-client:google-http-client-appengine:1.23.0
|    |    |    |    \--- com.google.http-client:google-http-client:1.23.0 (*)
|    |    |    +--- com.google.oauth-client:google-oauth-client:1.23.0 (*)
|    |    |    \--- com.google.oauth-client:google-oauth-client-servlet:1.23.0
|    |    |         +--- com.google.oauth-client:google-oauth-client:1.23.0 (*)
|    |    |         +--- com.google.http-client:google-http-client-jdo:1.23.0
|    |    |         |    +--- com.google.http-client:google-http-client:1.23.0 (*)
|    |    |         |    \--- javax.jdo:jdo2-api:2.3-eb
|    |    |         |         \--- javax.transaction:transaction-api:1.1
|    |    |         \--- javax.jdo:jdo2-api:2.3-eb (*)
|    |    +--- com.google.api-client:google-api-client:1.23.0 (*)
|    |    +--- com.google.api-client:google-api-client-servlet:1.23.0
|    |    |    +--- com.google.oauth-client:google-oauth-client-servlet:1.23.0 (*)
|    |    |    +--- com.google.api-client:google-api-client:1.23.0 (*)
|    |    |    +--- javax.servlet:servlet-api:2.5
|    |    |    \--- javax.jdo:jdo2-api:2.3-eb (*)
|    |    \--- com.google.http-client:google-http-client-appengine:1.23.0 (*)
|    +--- com.google.code.findbugs:jsr305:3.0.1
|    +--- io.swagger:swagger-models:1.5.9
|    |    +--- com.fasterxml.jackson.core:jackson-annotations:2.4.5 -> 2.9.0
|    |    +--- org.slf4j:slf4j-api:1.6.3 -> 1.7.21
|    |    \--- io.swagger:swagger-annotations:1.5.9
|    +--- io.swagger:swagger-core:1.5.9
|    |    +--- org.apache.commons:commons-lang3:3.2.1
|    |    +--- org.slf4j:slf4j-api:1.6.3 -> 1.7.21
|    |    +--- com.fasterxml.jackson.core:jackson-annotations:2.4.5 -> 2.9.0
|    |    +--- com.fasterxml.jackson.core:jackson-databind:2.4.5 -> 2.9.6 (*)
|    |    +--- com.fasterxml.jackson.datatype:jackson-datatype-joda:2.4.5
|    |    |    +--- com.fasterxml.jackson.core:jackson-annotations:2.4.0 -> 2.9.0
|    |    |    +--- com.fasterxml.jackson.core:jackson-core:2.4.5 -> 2.9.6
|    |    |    +--- com.fasterxml.jackson.core:jackson-databind:2.4.5 -> 2.9.6 (*)
|    |    |    \--- joda-time:joda-time:2.2 -> 2.9.4
|    |    +--- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.4.5
|    |    |    +--- com.fasterxml.jackson.core:jackson-core:2.4.5 -> 2.9.6
|    |    |    \--- org.yaml:snakeyaml:1.12
|    |    +--- io.swagger:swagger-models:1.5.9 (*)
|    |    +--- com.google.guava:guava:18.0 -> 20.0
|    |    \--- javax.validation:validation-api:1.1.0.Final
|    \--- org.slf4j:slf4j-nop:1.7.21
|         \--- org.slf4j:slf4j-api:1.7.21

I can see com.google.appengine:appengine-api-1.0-sdk:1.9.49 -> 1.9.64 and others that look like endpoints 1 dependencies, are these fine here?

1
Did you configure Guice correctly? cloud.google.com/endpoints/docs/frameworks/java/… - saiyr
Thanks @saiyr I think Guice configuration is fine, in web.xml I have a filter <filter> <filter-name>guiceFilter</filter-name> <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> </filter> and a listener <listener> <listener-class> bootstarppackage.GuiceModulesClass </listener-class> </listener> . The GuiceModulesClass extends GuiceServletContextListener . This should be fine I think - Japheth Odonya
@saiyr When I run 'gradle dependencies' I see com.google.appengine packages like appengine-api-1.0-sdk inside, should exclude these dependencies? They could be the ones causing confusion right? +--- com.google.endpoints:endpoints-framework:2.0.8 | +--- javax.servlet:servlet-api:2.5 | +--- com.fasterxml.jackson.core:jackson-databind:2.6.4 -> 2.9.6 | | +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0 | | \--- com.fasterxml.jackson.core:jackson-core:2.9.6 | +--- com.google.appengine:appengine-api-1.0-sdk:1.9.49 -> 1 - Japheth Odonya
Can you include your full web.xml configuration? - saiyr
@saiyr Please look at the edit , I have added the web.xml. I have still redacted some paths but this is how it looks like. If SO policy allows you can leave me a mail or just mail me ([email protected]) then I will send you the whole unredacted web.xml file - Japheth Odonya

1 Answers

0
votes

Since you are trying to use Guice, you need to configure Endpoints like in the migration guide. Note that some of the lines in the Guice module are not relevant unless you're using API management. The last line where configureEndpoints is called is the most important. Then add the module to your Guice configuration.