About me

Profile Picture

Full-stack software developer living in Auckland, New Zealand

Have rich experience and strong problem solving skills.
Know how to apply best practices in real product development.
A quick learner and always want to learn emerging techniques.

Skills & Interests

Learn as if you were to live forever.

– Mahatma Gandhi


HTML, JavaScript/CoffeeScript, CSS/LESS

Bootstrap, jQuery, AngularJS, Dojo, Backbone, RequireJS

Grunt, Bower, Yeoman



Spring, Hibernate, JPA, JSP, servlet





Jenkins, Gradle, Maven, Ant

Docker, Vagrant

MySQL, MongoDB






If you have knowledge, let others light their candles in it.

– Margaret Fuller


“Understanding the Java 7: the Core techniques and best practice” covers Java SE 7 new features and deep dive of Java platform core features, including JVM internals, byte code manipulation, class loader, generics, security, concurrent programming and serialization.

(Simplifed Chinese edition)

Technical articles

A regular author of IBM developerWorks China and InfoQ China website with more than 50 published technical articles covering various technical topics.

(Simplifed Chinese)

Recent Posts

FileNotFoundException when using Jersey with Spring Boot

Apr 13, 2015

When using Jersey with Spring Boot, you may see an FileNotFoundException error like below when Spring Boot starts:

org.springframework.beans.BeanInstantiationException: Failed to instantiate [myapp.JerseyConfig$$EnhancerBySpringCGLIB$$380920c5]:
Constructor threw exception; nested exception is org.glassfish.jersey.server.internal.scanning.ResourceFinderException:
java.io.FileNotFoundException: /Users/myapp.jar!/lib/myapp-ws.jar (No such file or directory)

AngularJS - Simple Collapse Directive

Feb 13, 2015

Collapse is a common control used in web pages. Users can click to expand or collapse it. Bootstrap has a simple declarative way to create collapse. But Bootstrap’s collapse doesn’t work if the markup is generated dynamically using AngularJS, because it relies on element id to match target element. For example, following code doesn’t work because id is generated dynamically using Collapse.

Use Synapse to workaround AWS ELB static IP limitations

Jan 21, 2015


The system receives data from a third-party service using TCP sockets. The service requires a static IP address to send the data. Several app nodes are created to receive and process data. AWS ELB is used as the load balancer for app nodes. But currently AWS ELB only has host name, but no static IP address. AWS has elastic IP addresses which are static, but cannot be associated with ELB.