有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Google应用程序引擎终结点生成安卓库方法类别()已在类中定义

我试图为我的GAE端点项目生成一个安卓客户端库,但遇到了一个奇怪的问题。当我生成一个iOS客户端库时,一切都很好,但对于Android GAE,它会生成一堆带有错误的java文件(我在JDK 1.7和1.8上进行了测试)。 我试着使用appcfg。sh和maven使用不同版本的GAE SDK,但结果是相同的

这是一个示例日志:

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 {

这可能是由于项目结构中的任何错误造成的吗


共 (2) 个答案

  1. # 1 楼答案

    以下是谷歌云技术支持部门对我们的案件编号05478936的回应:

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

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

    下面列出了各种错误,并按其种类进行了分类,以及表面原因。所有这些错误都发生在目标/端点客户端libs/uluvit/src/main/java/com/appspot/uluvitserver/uluvit/uluvit中。java,它似乎是一个由Guice生成的文件,遵循您的注入模式,最终从com中给出的方向派生而来。乌卢维特。后端。应用UluvitServlet模块。JAVA行号将引用生成的文件Uluvit中出现编译错误的位置。爪哇

    错误形式:方法____;已在类Uluvit(…*)

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

    错误形式:类

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

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

    这可以在编译器错误中观察到两次,相对于第9412876行。我们可以在第941行看到代码返回新的Discussion();当我们在827行定义构造函数以供讨论时,我们看到需要两个java。朗:争论很长,而不是没有争论

    找不到符号:

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

    找不到适合初始化的方法(Uluvit.Category)

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

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

    问题是Uluvit的功能。使用initialize(),它来自第115行,具有不同的方法签名:

    受保护的void initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest httpClientRequest)抛出java。伊奥。IOException

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

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

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

    致以最良好的祝愿

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

    [1]https://github.com/google/guice [2] https://github.com/google/guice/issues [3] https://groups.google.com/forum/#!forum/google-guice [4] https://groups.google.com/forum/#!forum/google-guice-dev [5] https://github.com/google/guice/wiki/Injections

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

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

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

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

  2. # 2 楼答案

    以下是谷歌云技术支持部门在回复我们的案件编号05478936时对此的回应。他们指的是我们发布在Guice问题跟踪器上的问题,他们指的是https://groups.google.com/forum/#!topic/google-guice/ou-ZUhCwJko

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

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

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

    这就是发生的事情:

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

    • 然后它尝试编译这些类并创建一个。jar可以作为客户机的依赖项加载。在你的应用程序中,所有的多*端点。java类聚集在一起构建一个文件Uluvit。java将被编译

    • 当你有一个API方法“user.friends”时,它会在生成的Uluvit API服务类中创建一个用户类来分组所有的“user.*”方法,并在用户内部创建一个friends类来处理该方法请求

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

    • 如果除了已经是一个方法之外,还将“friends”用作方法层次结构的一部分,则会导致命名冲突,因为“user.friends.acceptRequest”(以及其他类似的方法)需要在用户类中创建另一个friends类(以前是一个方法,而不是其中的类分组方法),以对所有“user.friends*”方法进行分组

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

    1. 在ItemEndpoint中。java:将“category.item”更改为“category.item.list”
    2. 在ItemEndpoint中。java:将“category”更改为“category.list”
    3. 在ItemEndpoint中。java:将“user.item”更改为“user.item.list” 在UserEndpoint中为4。java:将“user.friends”更改为“user.friends.list”

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

    真诚地

    尼克

    技术解决方案代表

    谷歌云平台