【问题标题】:InvocationTargetException when generating cloud endpoint class生成云端点类时的 InvocationTargetException
【发布时间】:2015-03-01 06:36:03
【问题描述】:

当我单击生成云端点客户端库时,我在错误日志中收到以下内容。

java.lang.reflect.InvocationTargetException
    at com.google.gdt.eclipse.appengine.swarm.wizards.GenerateSwarmApiAction$1.run(GenerateSwarmApiAction.java:82)
    at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:122)
Caused by: com.google.gdt.eclipse.appengine.swarm.wizards.helpers.SwarmGenerationException: com.google.api.server.spi.config.validation.MissingParameterNameException: tuberservice.com.rune.tuber.server.TuberServiceImpl.TuberServiceImpl.getInitParameter parameter (type class java.lang.String): Missing parameter name. Parameter type (class java.lang.String) is not an entity type and thus should be annotated with @Named.
    at com.google.gdt.eclipse.appengine.swarm.wizards.helpers.SwarmApiCreator.createSwarmApi(SwarmApiCreator.java:292)
    at com.google.gdt.eclipse.appengine.swarm.wizards.helpers.SwarmServiceCreator.create(SwarmServiceCreator.java:444)
    at com.google.gdt.eclipse.appengine.swarm.wizards.GenerateSwarmApiAction$1.run(GenerateSwarmApiAction.java:80)
    ... 1 more
Caused by: com.google.api.server.spi.config.validation.MissingParameterNameException: tuberservice.com.rune.tuber.server.TuberServiceImpl.TuberServiceImpl.getInitParameter parameter (type class java.lang.String): Missing parameter name. Parameter type (class java.lang.String) is not an entity type and thus should be annotated with @Named.
    at com.google.api.server.spi.config.validation.ApiConfigValidator.validateApiParameter(ApiConfigValidator.java:271)
    at com.google.api.server.spi.config.validation.ApiConfigValidator.validateParameter(ApiConfigValidator.java:229)
    at com.google.api.server.spi.config.validation.ApiConfigValidator.validateMethod(ApiConfigValidator.java:169)
    at com.google.api.server.spi.config.validation.ApiConfigValidator.validateMethods(ApiConfigValidator.java:130)
    at com.google.api.server.spi.config.validation.ApiConfigValidator.validate(ApiConfigValidator.java:93)
    at com.google.api.server.spi.config.validation.ApiConfigValidator.validate(ApiConfigValidator.java:63)
    at com.google.api.server.spi.config.jsonwriter.JsonConfigWriter.writeConfig(JsonConfigWriter.java:102)
    at com.google.api.server.spi.tools.AnnotationApiConfigGenerator.generateConfig(AnnotationApiConfigGenerator.java:62)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.gdt.eclipse.appengine.swarm.wizards.helpers.SwarmApiCreator.createSwarmApi(SwarmApiCreator.java:288)
    ... 3 more

这是我的服务实现

@SuppressWarnings("serial")
@Api(name = "tuberservice")
public class TuberServiceImpl extends RemoteServiceServlet implements
        TuberService {

    @Override
    @ApiMethod(name = "addClient")
    public String addClientService(TuberClient t) {
        if (t != null){
            PersistenceManager pm = PMF.get().getPersistenceManager();
            pm.makePersistent(t);
            pm.close();
            return t.toString();
        }
        return "Invalid client";
    }

    @SuppressWarnings("unchecked")
    @Override
    @ApiMethod(name = "listClients")
    public TuberClient[] listAllClientsService() {
        // TODO Auto-generated method stub
        //select from TuberClient
        PersistenceManager pm = PMF.get().getPersistenceManager();
        Query q = pm.newQuery(TuberClient.class);
        List<TuberClient> list = (List<TuberClient>) q.execute();
        ArrayList<TuberClient> returnList = new ArrayList<TuberClient>();
        for (TuberClient t : list){
            returnList.add(t);
        }//end for
        pm.close();
        return (TuberClient[])returnList.toArray(new TuberClient[0]);
    }

}

我已经为这个问题寻找了几个小时的解决方案。我尝试恢复到 appengine1.8.8,但它没有用,我尝试重建、清理等,没有,我什至尝试部署到 appengine,但没有用。

我真的不知道从哪里开始解决错误,因为我的服务器实现中没有任何要注释的字符串,所以我总体上很困惑。

【问题讨论】:

    标签: google-app-engine gwt google-cloud-endpoints


    【解决方案1】:

    您不能从 Cloud Endpoints 方法返回 String

    这行不会编译:

    public String addClientService(TuberClient t)
    

    这也很可疑:

    extends RemoteServiceServlet implements TuberService
    

    检查那里是否没有任何返回 String 的 API 方法。

    请阅读此guide。仔细检查您的代码是否返回有效值,并且每个必需参数都有对应的 @Name 注释。

    Endpoint方法中,返回值类型不能是简单类型 如字符串或整数。返回值需要是一个POJO,一个数组 或集合。此外,list() 和 get() 公开为 HTTP GET, insert() 公开为 HTTP POST,update() 公开为 HTTP PUT, 并且 removeNote() 被暴露为 HTTP DELETE。

    【讨论】:

    • 嘿,谢谢你的回答,但它没有用。我创建了一个名为 Void 的类,该类完全为空,并将其用作我的返回类型,我得到了完全相同的错误。我什至没有在我的服务器实现中传入或返回字符串。这简直令人沮丧。
    • @ChuckOnwuzuruike 检查更新的答案。尝试删除 extends RemoteServiceServlet implements TuberService 如果它在没有这些类的情况下工作,这意味着问题在 RemoteServiceServletTuberService
    • 等等,但如果我删除那些东西,我的 appengine rpc 服务器不会停止工作吗?
    • @ChuckOnwuzuruike 我不知道您在应用程序中使用什么,但 Cloud Endpoints 类不需要扩展任何服务或实现接口,这些是带有 @Api 注释的普通类。请注意您扩展或实现的内容,因为所有公共方法都导出为端点方法(您不需要将其注释为 @ApiMethod
    • 我的应用程序所做的只是询问用户的姓名,然后将其保存为数据存储。我使用应用程序引擎来做到这一点。我想我会尝试从安卓设备上点击 TuberService,所以我想我会使用端点的东西。所以我想我的问题是,如果我删除“扩展远程服务......”的东西,appengine 如何与我的后端服务器通信?
    猜你喜欢
    • 2013-12-22
    • 2013-05-19
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    相关资源
    最近更新 更多