问题
Im trying to write a gadget inside a jira plugin and I've encountered some problems even with a very simple one. Currently I'm trying to get a response from a simple java class i wrote. Following code is located in my gadget.xml:
Hello Gadget<br />
#requireResource("com.atlassian.gadgets.publisher:ajs-gadgets")
#requireResource("com.tngtech.gadgets.jira-complain-gadget-plugin:web-resources")
#includeResources()
#oauth
<script type="text/javascript">(function () {
var gadget = AJS.Gadget({
baseUrl: "__ATLASSIAN_BASE_URL__",
view: {
onResizeAdjustHeight: true,
enableReload: true,
template: function(args) {
var gadget = this;
window.alert("1");
gadget.getView().html(args.hello);
window.alert("2");
},
args: [{
key: "hello",
ajaxOptions: function () {
return {
url: "/rest/jira-rest/1.0/ComplainChart/HelloWorld"
};
}
}]
}
});
})();
</script>
]]></Content>
The Java class i adress looks like this:
@Path("/ComplainChart")
@AnonymousAllowed
@Produces(MediaType.TEXT_HTML)
public class ComplainChart {
public ComplainChart() {
}
@GET
@Path("/HelloWorld")
@Produces(MediaType.TEXT_HTML)
public Response getVersionsForProject() {
return Response.ok("Hello Java<br/>").build();
}
}
The URL is probably correct, the firebug output for the get Request looks like this:
throw 1; < don't be evil' >{"http://localhost:1990/jira/rest/jira-rest/1.0/complainChart/HelloWorld?cacheBuster=1308293636385":{"headers":{"set-cookie":["JSESSIONID=5652167D4DADE39719C4FED0C7174A03;Path=/","atlassian.xsrf.token=BV8N-OK2J-IQUQ-YNNK|b52c0f4b28944d7d11561aed079093f767448aca|lin; Path=/jira"]},"body":"Hello Java<br/>","rc":200}}
Even without the gadget.getView part, the alerts aren't executed (they are without the args part) and I get a huge Stack Trace in my atlas-run terminal
[INFO] [talledLocalContainer] com.atlassian.util.concurrent.LazyReference$InitializationException: com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes.
[INFO] [talledLocalContainer] at com.atlassian.util.concurrent.LazyReference.getInterruptibly(LazyReference.java:152)
[INFO] [talledLocalContainer] at com.atlassian.util.concurrent.LazyReference.get(LazyReference.java:115)
[INFO] [talledLocalContainer] at com.atlassian.plugin.servlet.DefaultServletModuleManager.getFilter(DefaultServletModuleManager.java:358)
[INFO] [talledLocalContainer] at com.atlassian.plugin.servlet.DefaultServletModuleManager.getFilters(DefaultServletModuleManager.java:212)
.............
Can anyone help me please?
Alex
Edit: Fyi here my pom file, I'm not sure, it's completely right this way:
<dependencies>
<dependency>
<groupId>com.atlassian.gadgets</groupId>
<artifactId>atlassian-gadgets-api</artifactId>
<version>3.1.7</version>
</dependency>
<dependency>
<groupId>com.atlassian.jira</groupId>
<artifactId>atlassian-jira</artifactId>
<version>${jira.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.atlassian.jira</groupId>
<artifactId>jira-func-tests</artifactId>
<version>${jira.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>1.1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.atlassian.jira</groupId>
<artifactId>jira-rest-plugin</artifactId>
<version>${jira.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.atlassian.plugins.rest</groupId>
<artifactId>atlassian-rest-common</artifactId>
<version>2.5.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.atlassian.sal</groupId>
<artifactId>sal-api</artifactId>
<version>2.1.0.beta1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.atlassian.maven.plugins</groupId>
<artifactId>maven-jira-plugin</artifactId>
<version>3.5-SNAPSHOT</version>
<extensions>true</extensions>
<configuration>
<productVersion>${jira.version}</productVersion>
<productDataVersion>${jira.data.version}</productDataVersion>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<jira.version>4.3.4</jira.version>
<jira.data.version>4.3.4</jira.data.version>
</properties>
回答1:
Found the solution: You need to return an Object of an own class with annotations like these:
@XmlRootElement
public static class HelloClass {
@XmlElement
String output;
HelloClass() {
output = "Hello";
}
HelloClass(String who) {
output = "Hello " + who;
}
}
回答2:
I had the same problem after I changed my REST API implementation. Firstly I reverted my changes but that worked not (I cannot understand why). Than I added XmlRootElement as suggested here, but it also worked not. Restarting the server, recompiling a clean plugin,... nothing worked.
So in despair I deleted the /target folder and restarted the operating system. And only that worked for me.
来源:https://stackoverflow.com/questions/6383846/jira-gadget-simple-call-to-rest-resource-doesnt-work