2015-10-25 9 views
2

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

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

/* 
* 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> 

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

[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

Видимо, это не имеет ничего общего с jiira, но в разочаровании вы, кажется, обвиняя его и его документацию. На самом деле это проблема с использованием пружины, и ваша очевидная неспособность читать следы стека.

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

3

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

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

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

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

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

Спасибо чувак! Я трачу также часы, чтобы исправить эту проблему, и только одна аннотация решила все. – xaph