Add generic error handling to BasicErrorController

Since Spring supports gobal error handling through
@ControllerAdvice, it is quite easy to set up more meta-data
about an exception for the BasicErrorController. You need
to be careful not to swallow Security exceptions, and probably
others (optionally) so this feature needs a bit more work.

See gh-538
This commit is contained in:
Dave Syer
2014-04-11 16:46:09 +01:00
parent 4474b104b6
commit 27580e726f
5 changed files with 190 additions and 6 deletions

View File

@@ -17,12 +17,17 @@
package sample.actuator;
import java.util.Collections;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import org.hibernate.validator.constraints.NotBlank;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Description;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@@ -32,16 +37,42 @@ public class SampleController {
@Autowired
private HelloWorldService helloWorldService;
@RequestMapping("/")
@RequestMapping(value="/", method=RequestMethod.GET)
@ResponseBody
public Map<String, String> helloWorld() {
public Map<String, String> hello() {
return Collections.singletonMap("message",
this.helloWorldService.getHelloMessage());
}
@RequestMapping(value="/", method=RequestMethod.POST)
@ResponseBody
public Map<String, Object> olleh(@Validated Message message) {
Map<String, Object> model = new LinkedHashMap<String, Object>();
model .put("message", message.getValue());
model.put("title", "Hello Home");
model.put("date", new Date());
return model;
}
@RequestMapping("/foo")
@ResponseBody
public String foo() {
throw new IllegalArgumentException("Server error");
}
protected static class Message {
@NotBlank(message="Message value cannot be empty")
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
}