James Gawron
James Gawron

Reputation: 969

Grails Rest Client Builder Throwing OperationNotSupported

I am trying to develop a Grails application to call some REST services ...

I am attempting to use the Grails Rest Client Builder Plugin ...

I have tried on several versions of Grails ... currently on most recent version ... 2.3.7 although I've tried with a few older versions as well ...

Using IntelliJ 13 ... started a Grails project ... threw together a quick domain class ... using create-domain-class ... defined a few fields and constraints ... then did generate-all ...

Defined the Rest plugin in the BuildConfig with

   compile ":rest-client-builder:2.0.0"

also tried with 2.0.1

I am defining the rest bean in the spring/resources.groovy

// Place your Spring DSL code here
beans = {
     rest(grails.plugins.rest.client.RestBuilder)
}

Generated a service with create-service ... it's pretty bare-bones

package myPackage

import grails.transaction.Transactional

@Transactional
class myService {

    def rest

    def serviceMethod() {
        def resp = rest.get("http://myServer/myContextRoot/allEmployees")
        return resp
    }
}

And I am calling this service method from the controller....

    def search() {
        myService.serviceMethod()

        // Not really trying to do anything yet other than see
        // if the bean gets injected properly and the method gets called.
        render("Not yet implemented")
    }

However I always get a Bean Instantiation Exception as the app is trying to start up.

| Running Grails application
| Error 2014-03-06 16:11:02,310 [localhost-startStop-1] ERROR     context.GrailsContextLoader  - Error initializing the application: Error creating bean with    name 'rest': Instantiation of bean failed; nested exception is   org.springframework.beans.BeanInstantiationException: Could not instantiate bean class    [grails.plugins.rest.client.RestBuilder]: Constructor threw exception; nested exception is   java.lang.UnsupportedOperationException
 Message: Error creating bean with name 'rest': Instantiation of bean failed; nested   exception is org.springframework.beans.BeanInstantiationException: Could not instantiate   bean class [grails.plugins.rest.client.RestBuilder]: Constructor threw exception; nested   exception is java.lang.UnsupportedOperationException
    Line | Method
->> 303 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   138 | run      in java.util.concurrent.FutureTask
|   895 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   918 | run      in     ''
^   680 | run . .  in java.lang.Thread
Caused by BeanInstantiationException: Could not instantiate bean class      [grails.plugins.rest.client.RestBuilder]: Constructor threw exception; nested exception is      java.lang.UnsupportedOperationException
->> 303 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   138 | run      in java.util.concurrent.FutureTask
|   895 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   918 | run      in     ''
^   680 | run . .  in java.lang.Thread
Caused by UnsupportedOperationException: null
->> 186 | put      in java.util.AbstractMap
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    69 | <init>   in grails.plugins.rest.client.RestBuilder
|    57 | <init> . in     ''
|   303 | innerRun in java.util.concurrent.FutureTask$Sync
|   138 | run . .  in java.util.concurrent.FutureTask
|   895 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   918 | run . .  in     ''
^   680 | run      in java.lang.Thread

Checking the Grails source it seems to be choking on code involved with Proxy intialization, I've attempted to fiddle with the bean instantiation to set proxy settings and it has no affect.

Feel like I must be missing something related to the Plugin configuration, but have been unable to track down the problem. Any constructive input would be most appreciated.

-Jim

Upvotes: 3

Views: 1106

Answers (1)

Andrew
Andrew

Reputation: 2249

The no-arg constructor of RestBuilder creates an immutable map via Collections.emptyMap() on which a put() is later attempted in certain cases (for example, if you have an HTTP proxy defined through your System properties). One workaround is to construct your rest bean using an explicit, mutable Map:

rest(grails.plugins.rest.client.RestBuilder, [:])

I haven't checked to see if this apparent bug has been filed in JIRA. If not, it would probably be worthwhile to create a ticket and attach your sample app.

Upvotes: 2

Related Questions