Sounds like a binding issue. Have you tried using Spring's <form:checkbox>
tag rather than <spring:bind>
? It will automatically generate the checkbox attributes as well as a hidden field that Spring uses to determine whether the checkbox is 'on' or 'off'.
Also, you should use the the varStatus
loop variable to keep track of the index.
editProfile.jsp
<ul>
<c:forEach var="item" items="${personViewModel.skillList}" varStatus="status">
<form:checkbox path="skillList[${status.index}].skillSelected" id="chkSkill${item.skillId}"/>
<label for="chkSkill${item.skillId}">${item.skillName}</label>
</c:forEach>
</ul>