IntelliJ Spring MVC @RequestMapping Not Registering

I've been trying to reintroduce myself to Spring MVC @RequestMapping and working with Java in IntelliJ after 5 years away from Java and having primarily used Netbeans for any development. My last experience with Java was with Netbeans helping manage a Maven build.

I had my @RequestMapping annotations set up, and IntelliJ is launching Tomcat directly (vs. deploying to an already running instance). I created my *-servlet.xml configurations, and had my .jsp files placed properly. Everything seemed to be in good shape and compiling fine, but the routes I specified we not showing up with the project was run.

Eventually, I went to Build -> Build Artifacts -> ...:war:exploded -> Edit... and went the Project Settings -> Artifacts tab and noticed "Library 'org.springframework:spring-web:4.3.13-RELEASE' required for module '...' is missing from the artifact". Upon clicking "Fix" and adding the dependency. Some combination of that dependency and 'org.springframework:spring-webmvc:4.3.13-RELEASE' missing prevented the org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping.registerHandler from processing my @RequestMapping annotations.

Catching Multiple Exceptions in Java JDK 7

I did some experimentation with catching multiple exceptions in Java 7. Given the following class definitions:

// all in individual files for package test
class QException extends Exception {
 
	public void blah() {
		System.out.println("blah!");
	}
}
 
class IException extends QException {
	public void a() {
		System.out.println("a!");
	}
}
 
class OException extends QException {
	public void b() {
		System.out.println("b!");
	}
}

The following compiles and runs:

package test;
 
import test.IException;
import test.OException;
import java.io.FileNotFoundException;
import java.io.IOException;
 
class TestMe {
	public static void main(String[] args) {
		try {
			double result = Math.random();
			if(result < 0.3) {
				throw new IException();
			} else if (result < 0.6) {
				throw new OException();
			} else {
				throw new FileNotFoundException();
			}
		} catch (IException | OException | IOException blahException) {
			System.out.println(blahException.getClass().getName());	
//			blahException.blah();	
		}
	}
}

The getName() function prints out test.IException, test.OException, and java.io.FileNotFoundException (depending on the random variable result). If you remove the comments on the .blah() call, it fails to compile. The reason why I have FileNotFoundException thrown but am catching the IOException is that initially I (for some reason) was having to cast the thrown FileNotFoundException to an IOException to have it matched by the IOException in the catch clause.

However, if you have just the two exceptions that are subclasses of QException, then the .blah() call is recognized. So, for interface consideration, the compiler appears to figure out the "greatest common subclass".

package test;
 
import test.IException;
import test.OException;
import java.io.FileNotFoundException;
import java.io.IOException;
 
class TestMe {
	public static void main(String[] args) {
		try {
			double result = Math.random();
			if(result < 0.5) {
				throw new IException();
			} else {
				throw new OException();
			}
		} catch (IException | OException blahException) {
			System.out.println(blahException.getClass().getName());	
			blahException.blah();	
 
		}
	}
}