es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Excepción de Método Faltante cuando se pasa una clase de implementación en lugar de una interfaz.

Estoy desarrollando un script en flujos de trabajo de Jira (usando Adaptavist Scriptrunner v.6.34) y me enfrento a un problema en el que groovy no acepta una implementación de una interfaz como parámetro de una función cuya firma permite la interfaz implementada.

Código

import com.atlassian.jira.issue.link.DefaultRemoteIssueLinkManager;

(...)

def remoteLink = DefaultRemoteIssueLinkManager.getRemoteIssueLinksForIssue(issue)

(<code>issue</code> es una variable de construcción de tipo com.atlassian.jira.issue.IssueImpl)

Lo que sucede

groovy.lang.MissingMethodException: No signature of method: static com.atlassian.jira.issue.link.DefaultRemoteIssueLinkManager.getRemoteIssueLinksForIssue() is applicable for argument types: (com.atlassian.jira.issue.IssueImpl) values: [ADA-24684]
Possible solutions: getRemoteIssueLinksForIssue(com.atlassian.jira.issue.Issue)
    at Script6.run(Script6.groovy:32)
  • La documentación del método está aquí
  • La firma del método espera un parámetro de tipo Issue (una interfaz)
  • El parámetro que estoy pasando es de tipo IssueImpl

No entiendo cómo groovy no acepta una implementación de una interfaz.

Lo que he intentado hasta ahora

Todas esas situaciones devolvieron la excepción original.

He impreso los métodos e interfaces de las clases y todo coincide con la documentación, por lo que no hay una falta de coincidencia de versiones aquí.

No sé qué más hacer ya que va más allá de mi conocimiento de java/groovy. He preguntado a colegas que son expertos en java y no están encontrando una razón para este comportamiento. ¿Alguna idea?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar relacionado con la naturaleza estática del método getRemoteIssueLinksForIssue. Al ser un método estático, parece que Groovy no puede inferir el tipo del argumento cuando es una implementación de una interfaz.

    Una posible solución podría ser usar una invocación dinámica en su lugar. Esto se puede lograr agregando el operador .& a la llamada del método, de esta manera:

    def remoteLink = DefaultRemoteIssueLinkManager.&getRemoteIssueLinksForIssue(issue)
    

    Esto debería permitir que Groovy infiera correctamente el tipo del argumento y acepte la interfaz implementada.

    Otra opción podría ser crear un método separado que acepte una implementación de la interfaz Issue y llame al método estático internamente. Esto podría verse así:

    def getRemoteIssueLinksForIssueImpl(issueImpl) {
        DefaultRemoteIssueLinkManager.getRemoteIssueLinksForIssue(issueImpl)
    }
    

    Luego, podrías llamar a este método con la variable issue:

    def remoteLink = getRemoteIssueLinksForIssueImpl(issue)
    

    Esto también debería funcionar, ya que el tipo del argumento está declarado explícitamente como la implementación de la interfaz Issue.

    ¡Espero que esto te ayude!

Comments are closed.