生成云端点类时的InvocationTargetException

时间:2015-03-01 06:36:03

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

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

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,但没有工作。

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

1 个答案:

答案 0 :(得分:0)

您无法从Cloud Endpoints方法返回String

这一行不会编译:

public String addClientService(TuberClient t)

这也是可疑的:

extends RemoteServiceServlet implements TuberService

检查您是否有任何返回String的API方法。

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

  

在Endpoint方法中,返回值类型不能是简单类型   例如String或int。返回值必须是POJO,一个数组   或收藏品。此外,list()和get()作为HTTP GET公开,   insert()作为HTTP POST公开,update()作为HTTP PUT公开,   和removeNote()作为HTTP DELETE公开。