android - Objectify+Eclipse+生成云端点客户端库: "Variable does not conform to style guide"

标签 android eclipse google-app-engine google-cloud-endpoints objectify

我正在使用:Eclipse、Java、Objectify、Google App Engine SDK

如果这个问题已经解决了,我很抱歉。但我找不到任何解决方案。情况如下:

我花了大约 3 周的时间来让我的项目成功。起初,我有一个 Android 项目。然后,使用 Google Eclipse 插件,我生成了一个 App Engine 后端(在 Eclipse 上)并开始使用 JPA。然而,我在人际关系方面遇到了太多问题。我只是失去了时间和耐心。因此,我决定转向客观化。

我按照 Objectify 文档的所有步骤构建了我的类。我定义了我的端点,用新的代码替换了以前的代码(使用 JPA)。 objectify 和 guava jar 都位于 WEB-INF/lib 和构建路径内。

问题:当我尝试生成 Cloud Endpoint 客户端库时,出现此错误:

为您的 Cloud Endpoints 类生成 API 元数据时出现问题:

com.google.appengine.repackaged.com.google.api.client.http.HttpResponseException: 
400 Bad Request
{"error": {"message": "Bad Request", "code": 400, "errors": [{"message": "api exception", "debug_info": "Variable  does not conform to style guide"}]}} 

错误日志:

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:121)
Caused by: com.google.gdt.eclipse.appengine.swarm.wizards.helpers.SwarmGenerationException: com.google.appengine.repackaged.com.google.api.client.http.HttpResponseException: 400 Bad Request
{"error": {"message": "Bad Request", "code": 400, "errors": [{"message": "api exception", "debug_info": "Variable  does not conform to style guide"}]}}
    at com.google.gdt.eclipse.appengine.swarm.wizards.helpers.SwarmApiCreator.createClientLibFromApiConfig(SwarmApiCreator.java:144)
    at com.google.gdt.eclipse.appengine.swarm.wizards.helpers.SwarmApiCreator.createSwarmApi(SwarmApiCreator.java:258)
    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.appengine.repackaged.com.google.api.client.http.HttpResponseException: 400 Bad Request
{"error": {"message": "Bad Request", "code": 400, "errors": [{"message": "api exception", "debug_info": "Variable  does not conform to style guide"}]}}
    at com.google.appengine.repackaged.com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1054)
    at com.google.api.server.spi.tools.CloudClientLibGenerator.postRequest(CloudClientLibGenerator.java:53)
    at com.google.api.server.spi.tools.CloudClientLibGenerator.generateClientLib(CloudClientLibGenerator.java:44)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.google.gdt.eclipse.appengine.swarm.wizards.helpers.SwarmApiCreator.createClientLibFromApiConfig(SwarmApiCreator.java:142)
    ... 4 more
Root exception:
com.google.gdt.eclipse.appengine.swarm.wizards.helpers.SwarmGenerationException: com.google.appengine.repackaged.com.google.api.client.http.HttpResponseException: 400 Bad Request
{"error": {"message": "Bad Request", "code": 400, "errors": [{"message": "api exception", "debug_info": "Variable  does not conform to style guide"}]}}
    at com.google.gdt.eclipse.appengine.swarm.wizards.helpers.SwarmApiCreator.createClientLibFromApiConfig(SwarmApiCreator.java:144)
    at com.google.gdt.eclipse.appengine.swarm.wizards.helpers.SwarmApiCreator.createSwarmApi(SwarmApiCreator.java:258)
    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)
    at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
Caused by: com.google.appengine.repackaged.com.google.api.client.http.HttpResponseException: 400 Bad Request
{"error": {"message": "Bad Request", "code": 400, "errors": [{"message": "api exception", "debug_info": "Variable  does not conform to style guide"}]}}
    at com.google.appengine.repackaged.com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1054)
    at com.google.api.server.spi.tools.CloudClientLibGenerator.postRequest(CloudClientLibGenerator.java:53)
    at com.google.api.server.spi.tools.CloudClientLibGenerator.generateClientLib(CloudClientLibGenerator.java:44)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.google.gdt.eclipse.appengine.swarm.wizards.helpers.SwarmApiCreator.createClientLibFromApiConfig(SwarmApiCreator.java:142)
    ... 4 more

一些示例(包括实体注册)。我将抑制包、导入和 getter/setter。如果有人知道如何提供帮助,我将非常感激。如果我应该在此处放置任何代码,请告诉我。

用户.java

@Entity
    public class User {
    @Id
    private Long id;

    private String name;

    @Index
    private PhoneNumber phoneNumber;

    private String friendCode;

    @Load
    private List<Ref<Group>> groups = new ArrayList<Ref<Group>>(); //groups that a User can be simple member

    //...
    }

Group.java

@Entity
public class Group {
    @Id
    private Long id;

    @Index(IfNotNull.class)
    private String name;

    @Load
    @Index
    private Ref<User> owner; // Owner of the group. The creator.

OfyService.java

import com.googlecode.objectify.Objectify;
import com.googlecode.objectify.ObjectifyFactory;
import com.googlecode.objectify.ObjectifyService;

public class OfyService {
    static {
        factory().register(Group.class);
        factory().register(User.class);      
    }

    public static Objectify ofy() {
        return ObjectifyService.ofy();
    }

    public static ObjectifyFactory factory() {
        return ObjectifyService.factory();
    }
}

UserEndpoint.java

import static com.uandq.lychee.OfyService.ofy;
@Api(name = "sampleEndpoint", namespace = @ApiNamespace(ownerDomain = "sample.com", ownerName = "sample.com", packagePath = ""))
public class UserEndpoint {


    @ApiMethod(name = "listUser")
    public List<User> listUser() {
        List<User> result = new ArrayList<User>();
        result = ofy().load().type(User.class).list();
        return result;
    }

    @ApiMethod(name = "getUser")
    public User getUser(@Named Long id) {
        User user = ofy().load().type(User.class).id(id).now();
        return user;
    }

    @ApiMethod(name = "insertUser")
    public User insertUser(User user) {
        ofy().save().entity(user).now();
        return user;
    }

    @ApiMethod(name = "removeUser")
    public void removeUser(@Named Long id) {
        ofy().delete().type(User.class).id(id).now();
    }

    @ApiMethod(name = "findUserByPhoneNumber")
    public User findUserByPhoneNumber(PhoneNumber phone) {

        User user = ofy().load().type(User.class)
                .filter("phoneNumber ==", phone).first().now();

        return user;
    }
}

GroupEndpoint.java

import static com.uandq.lychee.OfyService.ofy;

@Api(name = "sampleEndpoint", namespace = @ApiNamespace(ownerDomain = "sample.com", ownerName = "sample.com", packagePath = ""))
public class GroupEndpoint {

    @ApiMethod(name = "listGroup")
    public List<Group> listGroup() {
        List<Group> result = new ArrayList<Group>();
        result = ofy().load().type(Group.class).list();
        return result;
    }

    @ApiMethod(name = "getGroup")
    public Group getGroup(@Named Long id) {
        Group group = ofy().load().type(Group.class).id(id).now();
        return group;
    }

    @ApiMethod(name = "insertGroup")
    public Group insertGroup(Group group) {
        ofy().save().entity(group).now();
        return group;
    }

    @ApiMethod(name = "removeGroup")
    public void removeGroup(@Named Long id) {
        ofy().delete().type(Group.class).id(id).now();
    }

}

web.xml

<?xml version="1.0" encoding="utf-8" standalone="no"?><web-app version="2.5">
    <servlet>
        <servlet-name>SystemServiceServlet</servlet-name>
        <servlet-class>com.google.api.server.spi.SystemServiceServlet
        </servlet-class>
        <init-param>
            <param-name>services</param-name>
            <param-value>com.sample.GroupEndpoint, com.sample.UserEndpoint</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>SystemServiceServlet</servlet-name>
        <url-pattern>/_ah/spi/*</url-pattern>
    </servlet-mapping>
    <filter>
        <filter-name>ObjectifyFilter</filter-name>
        <filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>ObjectifyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

此外,我现在尝试按照以下步骤生成端点库: 使用endpoints.sh生成Android客户端库 通过终端。但效果并不好。我仍然得到:

Error: 400 Bad Request

{"error": {"message": "Bad Request", "code": 400, "errors": [{"message": "api exception", "debug_info": "Variable  does not conform to style guide"}]}}

欢迎任何帮助。 该问题也发布在:https://groups.google.com/forum/?hl=en-GB#!topic/objectify-appengine/981f4LlXscg

最佳答案

现在问题已经解决了。

解决方案:https://groups.google.com/forum/?hl=en-GB#!topic/objectify-appengine/981f4LlXscg

我发现了问题。实际上我遵循了此链接 https://cloud.google.com/developers/articles/google-cloud-endpoints-for-android 上的所有内容。然后,有:

Most parameter types must be serializable because JSON requires that the objects be serializable. You may also use any JavaBean, which includes anything from your model, since your model objects should conform to the JavaBean standard as described above. A limited set of types need not be serializable, but must be annotated with @Named. These are the types: String, int/Integer, boolean/Boolean, long/Long.

在我的端点中,某些参数以错误的方式使用注释@Named:没​​有参数的实际名称。我什至不需要实现可序列化。我刚刚更换:

public User getUser(@Named Long id)

public User getUser(@Named("id") Long id)

以及所有其他 @Named 参数。现在我可以生成端点库了。

关于android - Objectify+Eclipse+生成云端点客户端库: "Variable does not conform to style guide",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24782253/

相关文章:

android - 如何将 SVN 导入转换为 Android 项目

java - 使用自己的外部库部署 GWT 应用程序

android - 使用不同调度程序时 Android Doze 中的行为

android - 如何查找和删除具有重复值的字符串资源

eclipse - 如何从 Eclipse 中分离 JProfiler?

python - GAE 实体关系 : ancestor vs. 引用属性。与键列表

python - pip install webtest 后 Google App Engine 中出现“没有名为 webtest 的模块”错误

python - 既然不允许使用 Content-Length header ,是否可以在 GAE 应用程序中设置 blob 下载大小?

java - 确定android中的屏幕颜色深度

android - 如何以编程方式在 Android 中设置 locksreen 所有者信息消息?