有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring引导自定义错误控制器返回空JSON响应

我有一个Spring Boot应用程序。我已经配置了一个自定义错误控制器来处理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);
    }

}

这是我的应用程序类

    @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 configurations
error.whitelabel.enabled=false

这是我的日志记录

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) 个答案

  1. # 1 楼答案

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

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