Внедрение SoyTemplateRenderer в пользовательский плагин Atlassian JIRA

В настоящее время я пытаюсь разработать собственный плагин jira, который также использует сервлет для рендеринга шаблона Soy.

Это код моего сервлета:

    /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package at.fraiss.plugins.custommenuitem.servlets;

import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import com.atlassian.soy.renderer.SoyTemplateRenderer;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author Mario
 */
public class SoyTemplateServlet extends HttpServlet {

    private SoyTemplateRenderer soyTemplateRenderer;

    public SoyTemplateServlet(SoyTemplateRenderer soyTemplateRenderer)
    {
        this.soyTemplateRenderer = soyTemplateRenderer;
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
    {
        response.setContentType("text/html");
        response.getWriter().write(getHtml());
    }

    public String getHtml()
    {
        Map<String, Object> data = new HashMap<String,Object>();
        data.put("isLocal", true);
        data.put("url", "http://www.example.com");
        data.put("title", "example");
        return this.soyTemplateRenderer.render("jira.webresources:soy-templates", "JIRA.Templates.Links.helpLink", data);
    }
}

Вот как я определил файлы шаблонов сои в дескрипторе atlassian-plugin.xml:

<web-resource key="soy-templates">
    <dependency>com.atlassian.soy.soy-template-plugin:soy-deps</dependency>


    <!-- Available to the server-side only -->
    <resource type="soy" name="links" location="links.soy"/>
 
    <!-- Make available to the client-side in JS as well... -->
    <transformation extension="soy">
        <transformer key="soyTransformer"/>
    </transformation>
    <resource type="download" name="Links.soy.js" location="links.soy"/>
</web-resource>

Я добавил следующий раздел в мой pom.xml:

<dependency>
        <groupId>com.atlassian.soy</groupId>
        <artifactId>soy-template-renderer-api</artifactId>
        <version>4.0.4</version>
        <scope>provided</scope>
    </dependency>

и всегда получаю эту ошибку при попытке доступа к сервлету

[INFO] [talledLocalContainer] Caused by: org.springframework.beans.factory.Unsat isfiedDependencyException: Error creating bean with name 'at.fraiss.plugins.cust ommenuitem.servlets.SoyTemplateServlet': Unsatisfied dependency expressed throug h constructor argument with index 0 of type [com.atlassian.soy.renderer.SoyTempl ateRenderer]: : No qualifying bean of type [com.atlassian.soy.renderer.SoyTempla teRenderer] found for dependency: expected at least 1 bean which qualifies as au towire candidate for this dependency. Dependency annotations: {}; nested excepti on is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualif ying bean of type [com.atlassian.soy.renderer.SoyTemplateRenderer] found for dep endency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} [INFO] [talledLocalContainer] at org.springframework.beans.factory.support.Con structorResolver.createArgumentArray(ConstructorResolver.java:749) [INFO] [talledLocalContainer] at org.springframework.beans.factory.support.Con structorResolver.autowireConstructor(ConstructorResolver.java:185) [INFO] [talledLocalContainer] at org.springframework.beans.factory.support.Abs tractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanF actory.java:1139) [INFO] [talledLocalContainer] at org.springframework.beans.factory.support.Abs tractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFa ctory.java:1042) [INFO] [talledLocalContainer] at org.springframework.beans.factory.support.Abs tractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory. java:504) [INFO] [talledLocalContainer] at org.springframework.beans.factory.support.Abs tractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.ja va:342) [INFO] [talledLocalContainer] ... 2 filtered [INFO] [talledLocalContainer] at java.lang.reflect.Method.invoke(Method.java:4 97) [INFO] [talledLocalContainer] at com.atlassian.plugin.osgi.spring.DefaultSprin gContainerAccessor.createBean(DefaultSpringContainerAccessor.java:112) [INFO] [talledLocalContainer] at com.atlassian.plugin.module.ClassPrefixModule Factory.createModule(ClassPrefixModuleFactory.java:39) [INFO] [talledLocalContainer] at com.atlassian.plugin.module.PrefixDelegatingM oduleFactory.createModule(PrefixDelegatingModuleFactory.java:100) [INFO] [talledLocalContainer] at com.atlassian.plugin.servlet.descriptors.Serv letModuleDescriptor.getModule(ServletModuleDescriptor.java:48) [INFO] [talledLocalContainer] at com.atlassian.plugin.servlet.DelegatingPlugin Servlet.<init>(DelegatingPluginServlet.java:33) [INFO] [talledLocalContainer] at com.atlassian.plugin.servlet.DefaultServletMo duleManager$LazyLoadedServletReference.create(DefaultServletModuleManager.java:5 41) [INFO] [talledLocalContainer] at com.atlassian.plugin.servlet.DefaultServletMo duleManager$LazyLoadedServletReference.create(DefaultServletModuleManager.java:5 21) [INFO] [talledLocalContainer] at com.atlassian.util.concurrent.LazyReference$S ync.run(LazyReference.java:325) [INFO] [talledLocalContainer] at com.atlassian.util.concurrent.LazyReference.g ...

Я действительно разочарован тем, что документация atlassian SDK является такой "старой" и не обновляется до их текущих инструментов разработки и платформы.

Я надеюсь, что кто-то может мне помочь, спасибо

2 ответа

У меня тоже была эта проблема (и потерял на ней часы).

Сканер Spring, очевидно, обрабатывает только классы, помеченные @Named.

Это сработало для меня:

@Named("MyServlet")
public class MyServlet extends HttpServlet{
    @ComponentImport
    private final SoyTemplateRenderer soyTemplateRenderer;

    @Inject
    public MyServlet(@ComponentImport final SoyTemplateRenderer soyTemplateRenderer) {
        this.soyTemplateRenderer = soyTemplateRenderer;
    }
}

Очевидно, это не имеет никакого отношения к Джиира, но вы разочаровываетесь в своем разочаровании и документации. Это на самом деле проблема с использованием вами пружины и вашей очевидной неспособностью читать трассировки стека.

Первая запись в трассировке стека упоминает, по-разному, No qualif ying bean of type [com.atlassian.soy.renderer.SoyTemplateRenderer] found, Итак, вы, кажется, не предоставили определение bean-компонента для SoyTemplateRenderer для весеннего поиска. Исправьте это, и эта конкретная проблема исчезнет.

Другие вопросы по тегам