Saturday, December 14, 2013

Grails 2.3.2 > IllegalArgumentException: No enum constant org.springframework.http.HttpMethod.

I just encountered a pretty benign error that ended up taking me about an hour to resolve.  Since I didn't find any Q&As about this on stackoverflow.com, I figured I should document it in case anyone else runs into it.

So I wrote a simple Spock test for my AccountController.

@TestFor(AccountController)
@Mock([Account])
class AccountControllerSpec extends Specification {
    void "should return account with given identfier"() {
        when:
            def account = new Account(firstName: "Justin", lastName: "Miranda", age: 35).save(flush:true)
            params.id = account.id            
            controller.show()

        then:
            response.json.id == account.id
            response.json.firstName == account.firstName
            response.json.lastName == account.lastName
    }
}

Next, I wrote a simple controller with just a show method.

class AccountController {
    static allowedMethods = [show:"GET"]
    def show(Account account) {
        if (account == null) {
            render status:404
            return
        }
        render account as JSON
    }
}

Then I ran the unit test and received the following error.

grails> test-app unit: AccountController --verbose --stacktrace
| Running 1 unit test... 1 of 1
ID: 1
| Failure:  should return account with given identfier(com.kinectus.AccountControllerSpec)
|  java.lang.IllegalArgumentException: No enum constant org.springframework.http.HttpMethod.
at java.lang.Enum.valueOf(Enum.java:236)
at org.springframework.http.HttpMethod.valueOf(HttpMethod.java:27)
at org.codehaus.groovy.grails.plugins.web.api.ControllersApi.initializeCommandObject(ControllersApi.java:436)
at com.kinectus.AccountControllerSpec.should return account with given identfier(AccountControllerSpec.groovy:24)

Now that I know the solution, the error message is a little more helpful than I originally thought.  The period (.)  after HttpMethod is not the end of the sentence ... it's actually a hint to the answer.  It's saying No enum constant org.springframework.http.HttpMethod.SOMEVALUE.   It really should have only taken a few seconds to figure this out, but I had just spent a good deal of time working with HttpStatus, so I thought the issue was with HttpStatus for some reason.

Anyway, the solution is to add a request method to the test before calling the show controller action.

@TestFor(AccountController)
@Mock([Account])
class AccountControllerSpec extends Specification {
    void "should return account with given identfier"() {
        when:
            def account = new Account(firstName: "Justin", lastName: "Miranda", age: 35).save(flush:true)
            params.id = account.id
            request.method = "GET"
            controller.show()

        then:
            response.json.id == account.id
            response.json.firstName == account.firstName
            response.json.lastName == account.lastName
    }
}

And that's it.

Thursday, November 14, 2013

How to add a Unity Launcher for Intellij IDEA

This has been annoying me for the past two days.  I couldn't figure out how to edit the Intellij IDEA launcher after upgrading to the latest version of IDEA.  After playing around a bit and getting things working, I figured I'd post this so that I remember for the next upgrade (i.e. IDEA 13 is right around the corner).

Fire up Intellij IDEA

$ ~/apps/idea-IU-129.1359/bin/idea.sh

Create desktop entry (I always forget about this option)

Tools > Create desktop entry ...
(check the "Create entry for all users" checkbox so that the .desktop file is saved to /usr/share/applications)


Update .desktop file when you upgrade to a new version of Intellij IDEA

Different versions of IDEA create launchers with different names, so your file might have been saved as something else.  But for Intellij IDEA 12.1.6 Build 129.1359 the new desktop file is called jetbrains-idea.desktop.

If you ever lose that launcher or need to upgrade to a new version of Intellij IDEA, you can edit
$ sudo gedit /usr/share/applications/jetbrains-idea.desktop

/usr/share/applications/jetbrains-idea.desktop

[Desktop Entry]
Version=1.0
Type=Application
Name=IntelliJ IDEA
Icon=/home/jmiranda/apps/idea-IU-129.1359/bin/idea.png
Exec="/home/jmiranda/apps/idea-IU-129.1359/bin/idea.sh" %f
Comment=Develop with pleasure!
Categories=Development;IDE;
Terminal=false
StartupNotify=true
StartupWMClass=jetbrains-idea

If, for some reason, you click on the launcher and it doesn't launch, you may need to make the .desktop file executable.
$ sudo chmod +x /usr/share/applications/jetbrains-idea.desktop


Monday, November 11, 2013

How to disable a service in Ubuntu ...

$ sudo update-rc.d tomcat7 disable
update-rc.d: warning: tomcat7 start runlevel arguments (none) do not match LSB Default-Start values (2 3 4 5)
update-rc.d: warning: tomcat7 stop runlevel arguments (none) do not match LSB Default-Stop values (0 1 6)
 Disabling system startup links for /etc/init.d/tomcat7 ...
 Removing any system startup links for /etc/init.d/tomcat7 ...
   /etc/rc0.d/K08tomcat7
   /etc/rc1.d/K08tomcat7
   /etc/rc2.d/S92tomcat7
   /etc/rc3.d/S92tomcat7
   /etc/rc4.d/S92tomcat7
   /etc/rc5.d/S92tomcat7
   /etc/rc6.d/K08tomcat7
 Adding system startup for /etc/init.d/tomcat7 ...
   /etc/rc0.d/K08tomcat7 -> ../init.d/tomcat7
   /etc/rc1.d/K08tomcat7 -> ../init.d/tomcat7
   /etc/rc6.d/K08tomcat7 -> ../init.d/tomcat7
   /etc/rc2.d/K08tomcat7 -> ../init.d/tomcat7
   /etc/rc3.d/K08tomcat7 -> ../init.d/tomcat7
   /etc/rc4.d/K08tomcat7 -> ../init.d/tomcat7
   /etc/rc5.d/K08tomcat7 -> ../init.d/tomcat7

Thursday, August 9, 2012

Disabling Ubuntu services (like Jenkins) during startup

sudo sh -c "echo 'manual' > /etc/init/jenkins.override"

Monday, July 23, 2012

Using SSH with hostname tab completion

I've always hated typing the fully qualified hostname for a server that I wanted to SSH into.  I just learned how to configure Ubuntu to use tab completion with the SSH command.  Just run the following command and you can start using tab completion (NOTE: this might require a restart of your terminal session):

$ complete -W "$(echo $(grep '^ssh ' .bash_history | sort -u | sed 's/^ssh //'))" ssh


$ ssh [TAB]

See the following article for more details:
http://www.commandlinefu.com/commands/view/2759/ssh-autocomplete

Update:  I just realized this morning that there's one more thing you need to do to get this working properly.  Somehow you need to source your custom complete commands when you open a new terminal.  I use bash, so I vi'd my .bashrc file and added my custom completion commands.  There's also a directory called /etc/bash_completion.d for these scripts, but I felt a little squeamish putting my custom ones there.


# enable programmable completion features (you don't need to 
enable this, if it's already enabled in /etc/bash.bashrc 
# and /etc/profile sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion


    # custom completions
    complete -W "$(echo $(grep '^ssh ' .bash_history | sort -u | sed 's/^ssh //'))" ssh
fi

Monday, March 8, 2010

[SOLVED] RSA host key has changed

I've run into the "RSA host key for has changed" issue is a couple times in the past few months as we have a few servers whose IP addresses have changed.
jmiranda@jmiranda-laptop:~$ ssh www.example.com
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: POSSIBLE DNS SPOOFING DETECTED!
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for www.example.com has changed,
and the key for the corresponding IP address 12.34.56.78
is unknown. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
aa:bb:cc:dd:ee:ff:11:22:33:44:55:66:77:88:99:00.
Please contact your system administrator.
Add correct host key in /home/jmiranda/.ssh/known_hosts to get rid of this message.
Offending key in /home/jmiranda/.ssh/known_hosts:2
RSA host key for www.example.com has changed and you have requested strict checking.
Host key verification failed.
I've wasted a few minutes Googling the solution each time, so I'm adding a blog entry for it now so that I have a reference to the solution next time it happens.
jmiranda@jmiranda-laptop:~$ ssh-keygen -R www.example.com
/home/jmiranda/.ssh/known_hosts updated.
Original contents retained as /home/jmiranda/.ssh/known_hosts.old

Monday, February 15, 2010

Syntax Highlighter


function test() : String
{
return 10;
}