One thing to try would be to check if the code from the source examples gives you the same behavior, you can grab the working samples for each chapter here https://media.pragprog.com/titles/dswdcloj3/code/dswdcloj3-code.zip
If the code from examples works, then maybe you can do a diff between your project and the example to see what’s different.