Grails and Jira Integration using RESTClient - grails

I am using groovy http-builder and using RestClient for accessing web service from JIRA.
In development mode it's working fine but when I deploy war on Tomcat server it throws exception as
"org.apache.commons.collections.map.ListOrderedMap: method ()V
not found. Stacktrace follows:
org.codehaus.groovy.grails.web.servlet.mvc.exceptions.ControllerExecutionException:
Executing action [list] of controller [com.tristar.JiraController]
caused exception: Runtime error executing action
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662) Caused by: org.codehaus.groovy.grails.web.servlet.mvc.exceptions.ControllerExecutionException:
Runtime error executing action
... 3 more Caused by: java.lang.reflect.InvocationTargetException
... 3 more Caused by: java.lang.NoSuchMethodError: org.apache.commons.collections.map.ListOrderedMap: method ()V
not found
at net.sf.json.JSONObject.(JSONObject.java:1603)
at groovyx.net.http.EncoderRegistry.encodeJSON(EncoderRegistry.java:301)
at groovyx.net.http.HTTPBuilder$RequestConfigDelegate.setBody(HTTPBuilder.java:1200)
at groovyx.net.http.HTTPBuilder$RequestConfigDelegate.setPropertiesFromMap(HTTPBuilder.java:1111)
at groovyx.net.http.HTTPBuilder$RequestConfigDelegate.(HTTPBuilder.java:946)
at groovyx.net.http.RESTClient.post(RESTClient.java:140)
at com.tristar.JiraController.list(JiraController.groovy:221) "
def jiraApiUrl = 'http://ipAddress:8080/rest/api/2/'
def jiraClient = new RESTClient(jiraApiUrl)
def searchResults = jiraClient.post(requestContentType: JSON,
path: 'search',
body: [jql: "project=XYZ AND (status=Open OR status='In Progress') AND issuetype!=Epic AND issuetype!='Technical task'", startAt: offset, maxResults: params.max, fields: ['summary', 'description','issuetype']])
How can I fix this issue?

I am added these dependencies in Build Config
compile 'com.atlassian.jira:jira-rest-java-client-api:2.0.0-m25'
compile 'com.atlassian.jira:jira-rest-java-client-core:2.0.0-m25'
and using
AsynchronousJiraRestClientFactory factory = new AsynchronousJiraRestClientFactory()
def jiraServerUri = URI.create("ipaddress")
JiraRestClient restClient = factory.createWithBasicHttpAuthentication(jiraServerUri, "username", "password")
for authentication and getting RestClient object

Using JIRA REST Client for JAVA in Grails application is not necessary, though it might have resolved your issue. I faced the same issue and was able to create a JIRA REST client with Groovy HTTP Builder.
The only dependency that I added in BuildConfig.groovy was:
dependencies {
compile("org.codehaus.groovy.modules.http-builder:http-builder:0.5.0-RC1") {
excludes 'groovy', 'xml-apis' } }
Then build your JSON query and post your request:
jiraClient.post(requestContentType: JSON, body: query)
If you're looking for more info this blog post might help:
http://ashahrami.blogspot.ca/2014/12/jira-rest-client-implementation-in.html

Related

Grails: service not being injected in controller when running plugin

I'm creating a Grails (3.3.9) plugin to hold shared back-end code for some internal applications. For some reason, when I run the plugin to test it, my service is not being injected into my controller.
I've started with the default web-plugin profile, created a single domain class called Entry, and run generate-all to create a controller, service, and views. When I try to run my plugin as an application and view a single domain instance, I get the following error:
Cannot invoke method get() on null object. Stacktrace follows:
java.lang.reflect.InvocationTargetException: null
at org.grails.core.DefaultGrailsControllerClass$ReflectionInvoker.invoke(DefaultGrailsControllerClass.java:211)
at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)
at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException: Cannot invoke method get() on null object
at com.mycompany.internal.EntryController.show(EntryController.groovy:18)
... 14 common frames omitted
The stacktrace takes me to line 18 in my controller:
def show(Long id) {
respond entryService.get(id)
}
This suggests to me that entryService is null.
My domain class looks like this:
class Entry {
String entryCode
String description
}
The controller is as follows:
class EntryController {
EntryService entryService
static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"]
def index(Integer max) {
params.max = Math.min(max ?: 10, 100)
respond entryService.list(params), model:[entryCount: entryService.count()]
}
def show(Long id) {
respond entryService.get(id)
}
//snipped for brevity
And the service looks like this:
#Service(Entry)
interface EntryService {
Entry get(Serializable id)
//snipped for brevity
}
Based on the Grails plugin documentation, I would expect to be able to run the plugin standalone like any other application, and in normal applications, defining the service as an interface works fine. If I install this plugin to my local maven cache and use it in an application, it works exactly as I would expect; I am able to hit the controller's show endpoint and get back a result from my database.
At one point I tried implementing the service as a class rather than having it be an interface, but then I receive this error:
URI
/entry/index
Class
java.lang.IllegalStateException
Message
null
Caused by
Either class [com.mycompany.internal.Entry] is not a domain class or GORM has not been initialized correctly or has already been shutdown. Ensure GORM is loaded and configured correctly before calling any methods on a GORM entity.
What am I missing about how to set up and run a Grails plugin correctly?
Finally found an answer by digging into the GORM issue: class Authority is not a domain class or GORM has not been initialized correctly or has already been shutdown
Apparently the root of the problem was the need to add compile "org.grails.plugins:hibernate5" to my dependencies block in build.gradle. The weird thing is that the web-plugin profile provides the create-domain-class command, so I would think GORM and Hibernate support would be included by default, but I'm apparently misunderstanding some aspects of how plugins are supposed to work.

NPE ocurred when used `WebTestClient.mutateWith() ` in end to end tests

When I wrote some tests for webflux applications. And I tried to add credentials via mutateWith(mockUser().password("password")) in WebTestClient, but it caused NPE thrown.
I used bindToServer to connect test client to the running remote APIs, and tried to use mutateWith(mockUser().password("password")) add basic authentication to the request. It throws a NPE when the tests.
Updated Source codes: https://github.com/hantsy/spring-reactive-sample/blob/master/security-method/src/test/java/com/example/demo/IntegrationTests.java#L118-L127
After I explored the source codes of mockUser, it requires a MockServer environment to run the tests, but it was run as end 2 end in my sample.
Changed mutateWith(mockUser().password("password")) to .mutate().filter(basicAuthentication("user", "password")).build(), the NPE was disappeared.
Hope this helpful for you.
#Test
public void deletingPostsWhenUserCredentialsThenForbidden_mutateWith()
throws Exception {
this.rest
.mutate().filter(basicAuthentication("user", "password")).build()
.delete()
.uri("/posts/1")
.exchange()
.expectStatus().is4xxClientError()
.expectBody().isEmpty();
}
Updated Source codes: https://github.com/hantsy/spring-reactive-sample/blob/master/security-method/src/test/java/com/example/demo/IntegrationTests.java#L118-L127

Grails dependency injection from service to controller is not working

As per the grails 3.1.13 guide I am trying to add service dependency to my controller, but somehow it is not working for me. It is throwing NullPointerException for Cannot get property 'serviceMethod' on null object. Below I am mentioning the steps to reproduce.
Execute following commands
grails create-app DepInjectionTest
grails create-controller com.abc.project.KpiReport
grails create-service com.abc.project.KpiReport
Above creates below directory structure
KpiReportService
#Transactional
class KpiReportService {
def serviceMethod() {
return "Hello from KpiReportService"
}
}
KpiReportController
class KpiReportController {
def index() {
def kpiReportService
render kpiReportService.serviceMethod
//render "Hello from KpiReportController"
}
}
Exception
Grails application running at http://localhost:8080 in environment: development
ERROR org.grails.web.errors.GrailsExceptionResolver - NullPointerException occurred when processing request: [POST] /KpiReport/index
Cannot get property 'serviceMethod' on null object. Stacktrace follows:
java.lang.reflect.InvocationTargetException: null
at org.grails.core.DefaultGrailsControllerClass$ReflectionInvoker.invoke(DefaultGrailsControllerClass.java:210)
at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:187)
at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:961)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:895)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)
at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException: Cannot get property 'serviceMethod' on null object
at com.abc.project.KpiReportController.index(KpiReportController.groovy:7)
... 13 common frames omitted
Using postman for request
I am new to grails, please help me figure out what is going wrong, may be I am missing something.
The error message indicates you are referring to a property that does not exist. Instead of render kpiReportService.serviceMethod you want render kpiReportService.serviceMethod().
Services are injected as class variables
class KpiReportController {
def kpiReportService
def index() {
render kpiReportService.serviceMethod()
//render "Hello from KpiReportController"
}
}

Grails Unable to consume web service using Wsclient

I have used WSClient on my Grails application by adding groovyws-standalone-0.3.1.jar in lib folder of my project.
Added the following code in my controller:
import groovyx.net.ws.WSClient
....
....
def wsdlUrl = "url_Of_webservice?wsdl"
def payLoad = "list_Of_Parameters"
def result = ''
def proxy = new WSClient(wsdlUrl , this.class.classLoader)
try{
proxy.initialize()
result = proxy.getallvendorsbyurl(payLoad)
}
catch (java.lang.NullPointerException e){
println "proxy not initialize"
}
It is working fine in localhost but when i deploy it on tomcat6 server, it starts throwing exception :
On server logs:
ERROR errors.GrailsExceptionResolver - groovy.lang.GroovyObjectSupport
java.lang.ClassNotFoundException: groovy.lang.GroovyObjectSupport
On GSP page:
Error 500: Executing action [groupDetails] of controller [com.ongraph.yhd.GroupController] caused exception: java.lang.NoClassDefFoundError: groovy/lang/GroovyObjectSupport
Servlet: grails
URI: /grails/group/groupDetails.dispatch
Exception Message: groovy.lang.GroovyObjectSupport
Caused by:groovy.lang.GroovyObjectSupport
Class:GroupController
At Line: [758] (groupController->line-758->def wsdlUrl = "url_Of_webservice?wsdl")
I have also gone through the below mentioned link but no luck :(
link to a similar issue
I have used grails ws-client plugin and it worked like a charm.

"Could not deserialize the request scoped attribute with name" in Grails application

I've deployed my grails application on weblogic server. The front end is grails and backend is using spring and hibernate (not using gorm).
I am seeing the following error when I try to access a static dummy page:
<Dec 11, 2011 5:15:02 AM EST> <Error> <HTTP> <BEA-101362> <[ServletContext#450252357[app: spec-version:2.5]] could not deserialize the request scoped attribute with name: "userService"
java.io.NotSerializableException: org.codehaus.groovy.grails.commons.spring.ReloadAwareAutowireCapableBeanFactory
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
at org.springframework.transaction.interceptor.TransactionInterceptor.writeObject(TransactionInterceptor.java:186)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Truncated. see log file for complete stacktrace
><[ServletContext#450252357[app: spec-version:2.5]] could not deserialize the request scoped attribute with name: "referenceDataService"
java.io.NotSerializableException: org.codehaus.groovy.grails.commons.spring.ReloadAwareAutowireCapableBeanFactory
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
at org.springframework.transaction.interceptor.TransactionInterceptor.writeObject(TransactionInterceptor.java:186)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Truncated. see log file for complete stacktrace
>
Here are the action & controller classes:
class UserAdminController {
def messageSource
def userService
def referenceDataService
def manageUsers = {
render(view: "manageUsers")
}
def showCreateUserAdmin = {
//code goes here
}
}
The reason for writing a dummy action is that the user shouldn't call the gsp page using manageUsers.gsp.
How can I fix this issue?

Resources