Внедрение 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 для весеннего поиска. Исправьте это, и эта конкретная проблема исчезнет.