However, this link works:
http://localhost:9000/gs(without "/" suffix!)
Later I realized that I have an entry in the routing table of the demo app:
GET /gs/ staticDir:public/gs, for shortcut of URL to compressed/minimized files.
Yes, this is the problem. You can't make both static file and controller mapping to the same url path!