当前位置: 首页 > 知识库问答 >
问题:

Spring ExceptionHandler和Rest响应的异常

商业
2023-03-14

我正在使用@ExceptionHandler来管理我的所有异常,并为任何抛出异常的REST API返回一个JSON响应。目前我管理两个异常,第一个是ResourceNotFoundException,它可以工作,但第二个是FileExtensionException,它不工作。它在eclipse控制台中抛出这个异常,而在rest响应中抛出任何东西。

2015-09-21 09:09:05.197错误7500---[nio-8080-exec-2].M.M.A.ExceptionHandlerExceptionResolver:无法调用@ExceptionHandler方法:public Matlab.ErrorResponse Matlab.ErrorController.ErrorHandler(java.lang.Exception)

2015-09-21 09:09:05.201错误7500---[nio-8080-exec-2]O.S.Boot.Context.Web.ErrorPageFilter:由于异常[所选文件具有不同的扩展名:XLSX而不是zip],正在从请求[/ManagementFile/ZipDownload]转发到错误页

以下是WebServices调用的代码

public FileSystemResource getZipFile(String fileName) throws FileExtensionException {
    String ext=FilenameUtils.getExtension(fileName);
    if (ext!= "zip")
        throw new FileExtensionException(ext + " and not zip");
    return new FileSystemResource(new File(fileName));
}

例外情况:

package matlab;

public class FileExtensionException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public FileExtensionException(String message){
        super("The selected file has a different extension:" + message);
    }
}

RESTController:

@RequestMapping(value = "/files", method = RequestMethod.GET)
public Response<Collection<FileModel>> getAllFiles(@RequestParam(value="path", defaultValue="/home") String path) throws ResourceNotFoundException {
    Collection<FileModel> result;
    result = file.getAllFiles(path);
    return new Response<Collection<FileModel>>(HttpStatus.OK.value(),result);
}

@RequestMapping(value = "/zipDownload", produces="application/zip", method = RequestMethod.GET)
@ResponseBody
public FileSystemResource getZip(@RequestParam(value="filePath", required=true) String filePath ) throws FileExtensionException{
    return file.getZipFile(filePath);
}

ResourceNotFoundException

public class ResourceNotFoundException extends Exception {
    private static final long serialVersionUID = 1L;

    public ResourceNotFoundException(String path){
        super("The specified path: "+ path +"  doesn't exist");
    }
}
@ControllerAdvice 
public class ErrorController {

    /**
     * 
     * @param e: exception thrown
     * @return ErroreResponse
     */
    @ExceptionHandler(Exception.class)
    public @ResponseBody ErrorResponse errorHandler(Exception e){   
        //Make the exception by buildErrorResponse
        return ErrorResponseBuilder.buildErrorResponse(e);
    }

}
public class ErrorResponseBuilder {

    public ErrorResponseBuilder() { 
    }

    /**
     * Build exception response beginning from exception
     * @param e exception thrown
     * @return ErrorResponse: response of an exception
     */
    public static ErrorResponse buildErrorResponse(Exception e){
        StringWriter errors = new StringWriter();
        e.printStackTrace(new PrintWriter(errors));
        return new ErrorResponse(HttpStatusManager.getHttpCode(e),e.getClass().getName(),e.getMessage(),errors.toString());
    }

}

问题出在哪里?谢谢

共有1个答案

司寇望
2023-03-14

尝试用以下方法更新spring配置:

<bean id="methodHandlerExceptionResolver" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver">
        <property name="messageConverters">
            <list>
                <ref bean="stringHttpMessageConverter"/>
                <ref bean="jsonHttpMessageConverter"/>
                <ref bean="marshallingHttpMessageConverter"/>
            </list>
        </property>
    </bean>
 类似资料:
  • 我想返回一个临时重定向,使用AsyncACK。 下面的“工作”(因为没有错误),但似乎不是异步的(它一次处理一个请求)。 这应该工作吗?如果我明确需要像https://jersey.github.io/documentation/latest/async.html#d0e9895一样启动一个新线程,返回响应是什么样子的?

  • 我用java制作了一个REST API,我有以下DTO。 在我的API类中,我从sql获取上述DTO的数据,并使用以下代码返回响应: 所以我的疑虑是: 为什么对象列表在响应中排在第三位,尽管我在DTO中声明了它的最后一位? 为什么isTypeTrue和isTypeSpecial在输出中显示为TypeTrue和TypeSpecial? 尽管我首先声明了isTypeSpecial,但为什么isType

  • 嗨,我正在尝试使用HttpURLConnection POST方法进行服务器请求,但没有收到任何响应,我在SO中看到了一些帖子,但我无法理解它们。下面是我的代码 上面的代码给我错误FilenotoundExcepttion stackTrace如下 这是我的URL

  • 这方面的最佳实践是什么。NET与Web API?特别是WebRESTAPI。当异常发生时,RESTAPI是否应该在响应体中返回异常? 当然,我会返回500或类似的HTTP状态。但是当我用这个错误代码响应时,最佳实践是什么?或者更好的是,规范或RESTAPI对此有何规定? 返回异常(我所做的)

  • 创建一个 API 的时候处理错误是很痛苦的。为了避免手动的创建错误响应,你可以简单的抛出一个继承了 Symfony\Component\HttpKernel\Exception\HttpException 的异常,API 会自动的为你处理响应。 这里是 Symfony 内置的异常列表。 异常 状态码 Symfony\Component\HttpKernel\Exception\AccessDeni

  • 我有一个方法,调用一个endpoint来发布客户我怎么才能只得到消息"EMAIL ALREADY EXISTS"从响应体的Rest模板,以便在FacesContext中显示它 这是回应机构