Java 类中已定义Google App Engine端点-生成android库-方法类别()

Java 类中已定义Google App Engine端点-生成android库-方法类别(),java,android,google-app-engine,Java,Android,Google App Engine,我试图为我的GAE端点项目生成一个android客户端库,但遇到了一个奇怪的问题。当我生成一个iOS客户端库时,一切都很好,但对于Android GAE,它生成了一堆java文件,其中有我在JDK 1.7、1.8上测试过的错误。 我尝试在不同版本的GAE SDK中使用appcfg.sh和maven,但结果是一样的 这是一个示例日志: symbol: class Ranking location: class MyApp myApp-backend/myApp-backend-api-war/

我试图为我的GAE端点项目生成一个android客户端库,但遇到了一个奇怪的问题。当我生成一个iOS客户端库时,一切都很好,但对于Android GAE,它生成了一堆java文件,其中有我在JDK 1.7、1.8上测试过的错误。 我尝试在不同版本的GAE SDK中使用appcfg.sh和maven,但结果是一样的

这是一个示例日志:

symbol:   class Ranking
location: class MyApp
myApp-backend/myApp-backend-api-war/myApp/src/main/java/com/appspot/myAppserver/myApp/MyApp.java:1482: error: cannot find symbol
public Rating rating() {

symbol:   class Rating
location: class MyApp
myApp-backend/myApp-backend-api-   war/myApp/src/main/java/com/appspot/myAppserver/myApp/MyApp.java:1757:     error: cannot find symbol
public User user() {

symbol:   class User
location: class MyApp
myApp-backend-api-    war/myApp/src/main/java/com/appspot/myAppserver/myApp/MyApp.java:2321:     error: method category() is already defined in class MyApp
public Category category() throws java.io.IOException {

这可能是由项目结构中的任何错误引起的吗?

以下是谷歌云支持部门针对我们的案例编号05478936所做的回应:

2015年2月26日下午1:57谷歌云支持响应:

此时,我能够观察到您在运行mvn appengine:endpoints\u get\u client\u lib时在初始票证描述中描述的编译错误。我相信这些编译错误的原因与您如何构造/编写代码有关,特别是与Guices注入特性有关。我将尽我所能深入了解如何解决这些编译错误,但请注意,它们似乎不是由SDK引起的,而是由您使用Guice引起的,因此下一步是从Guice项目[1]定义的支持渠道寻求支持,例如github问题页面[2]或邮件列表[3][4]。您可以在他们的wiki[5]中深入了解注入功能,此外,您还可以利用自己目前对Guice工作原理的了解,以及在编写应用程序时对其功能的使用

下面列出了各种错误,并按其种类进行了分类,以及表面原因。所有这些错误都发生在target/endpoints客户机libs/uluvit/src/main/java/com/appspot/uluvitserver/uluvit/uluvit.java中,它似乎是由Guice按照注入模式组合而成的生成文件,最终来自com.uluvit.backend.application.UluvitServletModule.java中给出的说明。行号将引用生成的文件Uluvit.java中发生编译错误的位置

错误形式:已在类Uluvit….*?….中定义了方法:

这可以在编译器错误中观察到两次,相对于第29792389行。我们可以在2979上看到,定义了方法类别,返回了类类别的对象,而第130行已经使用了相同的方法签名

错误形式:类已在类Uluvit….*?….中定义:

相对于第947、2396、2882、2985行,在编译器错误中可以观察到四次。我们可以在第947行看到定义了类讨论,而在第810行已经定义了相同的类,但是继承不同

类中的构造函数不能应用于给定类型:

这可以在编译器错误中观察到两次,相对于第9412876行。我们可以在第941行看到代码返回新的讨论;在第827行(此处定义了构造函数以供讨论)中,我们看到它使用了两个java.lang.Long参数,而不是没有参数

找不到符号:

在maven编译阶段的错误输出中,对于类Ranking、Rating和User,此错误发生三次。分别在第1293行、第1482行和第1757行,有一个方法试图返回这些类中的每一个,其定义如下。可能是

未找到初始化Uluvit.Category的合适方法

此错误在maven编译阶段错误输出中发生一次。第2980行出现以下代码:

类别结果=新类别; 初始化结果; 返回结果

问题是,使用了来自第115行的函数Uluvit.initialize,它具有不同的方法签名:

受保护的void initializecom.google.api.client.googleapis.services.AbstractGoogleClientRequest httpClientRequest抛出java.io.IOException

这就结束了对项目生成的编译器错误的分析

我希望我的调查对你有所帮助。似乎错误不在于SDK,而在于您使用Guice生成Api类。我没有资格深入讨论Guice或者如何调试您的注入,但我很高兴我能够帮助您确定这一点。可能您有多个类,这些类在其他文件中不会重叠,它们的名称会发生冲突,这是因为注入模式产生了单片服务类Uluvit

既然我们已经确定问题不在于SDK,而在于Guice,您可以通过github pages问题功能或通过邮寄到邮件列表来访问支持,除了Guice标签上的stackoverflow之外,您是否希望我现在继续并关闭此案例?如果您对SDK有任何其他问题,请告诉我,我很乐意为您提供帮助

致以最良好的祝愿

尼克 技术解决方案代表 云平台支持

[1] [2] [3] [4] [5]

2015年2月26日下午3:05谷歌云支持响应:

在这一点上,我认为问题不在于Guice的版本,而在于使用模式。命名冲突似乎源于创建Uluvit.java的各种类中的大量@Inject注释。您需要根据您对Guice注入工作原理的了解来调试Guice注入。与Guice的人取得联系是朝着这个方向迈出的一大步

现在,就推荐的DI库而言,我们不推荐任何特定的库,因为我们希望对开发人员的选择保持开放。最佳工具的定义是最符合您需求的工具,无论您如何解释它们


我相信,根据我上一条消息中的分析,并与Guice人员取得联系,同时回顾您的注入和类、方法的命名,您应该能够调试这些编译错误。生成客户端库操作失败的原因是由于Uluvit.java中的这些编译错误,而不是由于端点工具或SDK的任何问题。

下面是谷歌云支持部门在回应我们的案例编号05478936时对此所说的话。当他们提到我们发布在Guice问题跟踪器上的问题时,他们指的是:

2015年3月2日上午9:09谷歌云支持响应:

我已经通读了你在Guice问题跟踪器中发布的帖子,我也一直在深入阅读Guice,因为我想确保你在这里得到最好的解决方案,并且我能够准确地理解你的应用程序中发生了什么。在深入阅读了您的源代码之后,我发现Guice注入并不是问题所在——我认为Guice的注入系统是Uluvit.java文件命名冲突的原因

在仔细检查您的API方法层次结构后,我可以看出导致这种行为的是API方法的命名。我会解释一下,这样你就可以确切地知道发生了什么,我还会列出你需要做的几个小改动,以获得成功的编译。此外,我还提交了一个docs改进请求,以警告可能存在的名称冲突,并启动了在端点客户端库生成过程中实现更多有用错误消息的过程,例如您的情况

这就是发生的事情:

Java端点客户端库生成代码通过读取代码来查找Api注释的类和方法,从而创建源文件

然后,它尝试编译这些类并创建一个.jar,您可以将其作为依赖项加载到客户端。在您的应用程序中,所有多个*Endpoint.java类组合在一起,以构建一个将被编译的文件Uluvit.java

当您有一个API方法user.friends时,它会在生成的Uluvit API服务类中创建一个user类来对所有user.*方法进行分组,并在user中创建一个friends类来处理该方法请求

创建User.Friends类是因为它对应于作为层次结构中最后一个符号的API方法,它是一个方法,而其他类只是为了帮助提供命名上下文。对于API中的每个方法,它都将被分组在如下子类中,表示方法层次结构,直到它到达实际的方法,该方法将是一个扩展了AbstractGoogleJSonClient的类,它扩展了AbstractGoogleJSonClient请求,表示API上该方法的请求处理程序,返回类型为T的对象

如果除了已经是方法之外,还将朋友用作方法层次结构的一部分,则会导致命名冲突,因为user.friends.acceptRequest和其他此类方法将需要创建另一个以前作为方法的朋友类,没有一个类在它里面分组方法在用户类里面分组所有的User.friends*方法

在这种情况下,根据其实际功能将user.friends更改为user.friends.list可以消除名称冲突,并且可以使user.friends方法保持在层次结构的统一级别。有几种方法也出现了同样的问题,这就是所有需要改变的地方:

在ItemEndpoint.java中:将category.item更改为category.item.list 在ItemEndpoint.java中:将category更改为category.list 在ItemEndpoint.java中:将user.item更改为user.item.list 4在UserEndpoint.java中:将user.friends更改为user.friends.list 您能否尝试进行这4项更改,并让我知道客户端库生成是否适合您?此外,如果您还有任何问题,请随时告诉我,我将非常乐意为您提供帮助。我希望,尽管我最初相信我们已经找到了错误的原因,但我的承诺是,一旦我们发现Guice注入不存在,就确保您得到解决方案,您会感到支持 原因

真诚地

尼克

技术解决方案代表

谷歌云平台