Spring Boot自定义错误控制器返回空的json响应

时间:2016-05-04 17:56:45

标签: java spring-mvc error-handling spring-boot annotations

我有一个春季启动应用程序。我已配置自定义错误控制器来处理404错误。它返回一个空响应。我得到了日志语句,显示调用自定义错误控制器方法。但我在SOAP UI或Chrome Postman中看不到回复。请帮助!!

 @RestController
public class MyErrorController implements ErrorController {

    private static final String PATH = "/error";

    private boolean debug = true;
    private static final Logger log = LoggerFactory.getLogger(MyErrorController.class);

    @Autowired
    private ErrorAttributes errorAttributes;

    @RequestMapping(value = PATH)
    public MyGlobalError error(HttpServletRequest request, HttpServletResponse response) {
        log.error("***" + RequestCorrelation.getId() + "***" + "MyErrorController - error ()");
        MyGlobalError error = new MyGlobalError(request.getMethod(), response.getStatus(),
                getErrorAttributes(request, debug));
        return error;
    }

    @Override
    public String getErrorPath() {
        return PATH;
    }

    private Map<String, Object> getErrorAttributes(HttpServletRequest request, boolean includeStackTrace) {
        RequestAttributes requestAttributes = new ServletRequestAttributes(request);
        return errorAttributes.getErrorAttributes(requestAttributes, includeStackTrace);
    }

}

这是我的app类

    @EnableAutoConfiguration // Sprint Boot Auto Configuration
@ComponentScan(basePackages = "com.app")
@EnableJpaRepositories("com.app.jpa") // To segregate MongoDB
                                                        // and JPA repositories.
                                                        // Otherwise not needed.
@EnableSwagger // auto generation of API docs
@SpringBootApplication
@EnableAspectJAutoProxy
@EnableConfigurationProperties

public class Application extends SpringBootServletInitializer {

    private static Class<Application> appClass = Application.class;

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(appClass).properties(getProperties());

    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public FilterRegistrationBean correlationHeaderFilter() {
        FilterRegistrationBean filterRegBean = new FilterRegistrationBean();
        filterRegBean.setFilter(new CorrelationHeaderFilter());
        filterRegBean.setUrlPatterns(Arrays.asList("/*"));

        return filterRegBean;
    }

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    static Properties getProperties() {
        Properties props = new Properties();
        props.put("spring.config.location", "classpath:/");
        return props;
    }

    @Bean
    public WebMvcConfigurerAdapter webMvcConfigurerAdapter() {
        WebMvcConfigurerAdapter webMvcConfigurerAdapter = new WebMvcConfigurerAdapter() {
            @Override
            public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
                configurer.favorPathExtension(false).favorParameter(true).parameterName("media-type")
                        .ignoreAcceptHeader(true).useJaf(false).defaultContentType(MediaType.APPLICATION_JSON)
                        .mediaType("xml", MediaType.APPLICATION_XML).mediaType("json", MediaType.APPLICATION_JSON);
            }
        };
        return webMvcConfigurerAdapter;
    }

    @Bean
    public RequestMappingHandlerMapping defaultAnnotationHandlerMapping() {
        RequestMappingHandlerMapping bean = new RequestMappingHandlerMapping();
        bean.setUseSuffixPatternMatch(false);
        return bean;
    }
}

我在我的属性文件中有这个

错误配置

error.whitelabel.enabled =假

这是我的日志条目

2016-05-04 12:26:45 - ***f37dbfea-daeb-4d35-bac3-73bb5fb25c1c***-Entering: MyErrorController.error
2016-05-04 12:26:45 - ***f37dbfea-daeb-4d35-bac3-73bb5fb25c1c***MyErrorController - error ()
2016-05-04 12:26:45 - ***f37dbfea-daeb-4d35-bac3-73bb5fb25c1c***-Exited: MyErrorController.error

1 个答案:

答案 0 :(得分:1)

您可以使用控制器建议和单独的休息错误处理程序并处理每种异常类型 see this answer

您可以创建自定义响应json对象,此处需要@ResponseBody注释
或类似于此处使用的一般错误响应click here