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

HTTP状态500-...当我在Spring控制器中使用响应状态注释和返回值时,未知的返回值类型

戎兴言
2023-03-14

我编写了以下控制器方法:

    @RequestMapping(value = "/member/createCompany/uploadImage1", method = RequestMethod.GET)
    @ResponseStatus(HttpStatus.OK)
    public Long handle() {
        return 1l;
    }

当我在浏览器中请求此方法时,我看到以下内容:

HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException: Unknown return value type [java.lang.Long]

type Exception report

message Request processing failed; nested exception is java.lang.IllegalArgumentException: Unknown return value type [java.lang.Long]

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: Unknown return value type [java.lang.Long]
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:948)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260)
root cause

java.lang.IllegalArgumentException: Unknown return value type [java.lang.Long]
    org.springframework.util.Assert.notNull(Assert.java:112)
    org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:68)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:122)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(Charac
    .........

我实现服务器端错误还是客户端问题?

更新NJNEX答案。

如果我想在控制器方法中实现以下逻辑,我应该怎么做:

       if(someCondition){
           return 1l;
       }else{
         //I want to return 500 or 400 http code
       }

共有2个答案

马清野
2023-03-14

@restController是控制器的专用版本。它包括@Controller和@响应体注释,因此简化了控制器的实现:

@RestController
@RequestMapping("books-rest")
public class SimpleBookRestController {

@GetMapping("/{id}", produces = "application/json")
public Book getBook(@PathVariable int id) {
    return findBookById(id);
}

private Book findBookById(int id) {
    // ...
}


 }

我考虑过这种情况(未知返回值类型)。我认为你在这门课上应用了@Controller注释。如果要修复它,则需要应用@Controller而不是@RestControllerannotatan。

请参阅此链接,
https://www.baeldung.com/spring-controller-vs-restcontroller

朱兴运
2023-03-14

在这种情况下使用@响应体注释。没有它,Spring将返回值解释为视图名称。但它不能很长,这就是为什么你得到错误未知的返回值类型

@ResetseBody注释类似于@刚体。这个注释可以放在一个方法上,并指示返回类型应该直接写入HTTP响应主体(而不是放在模型中,或者解释为视图名称)。

Spring参考响应

如果你想返回错误代码从响应体使用:

return new ResponseEntity<String>(HttpStatus.BAD_REQUEST);

另请参见如何在@ResponseBody中响应HTTP错误

 类似资料:
  • 我使用curl获取http头以查找http状态代码并返回响应。我使用以下命令获取http头

  • 我的项目由以下四个表组成: 问题 - Question_id,问题文本 用户 - User_ID、名称 Question_Answer - 用户 ID、Question_ID、答案 问题类型 - 问题 ID、标签 我必须基于多个标签生成问题 或者简单地返回所有问题的列表(当没有提供标签时) 或者将用户提供的答案插入到Question_Answer表中。 控制器类SpringServiceContr

  • 问题内容: 通过使用reactjs后挂机,不返回此状态下的电流值,我该如何处理呢? 这是这种情况的代码,尝试找出控制台日志的显示内容。 问题答案: 默认情况下,只做一件事,只做一件事,设置新状态并导致函数重新呈现。它本质上是异步的,因此默认情况下,通常在它运行之后运行的方法。 从您的示例中,在页面的全新加载中,键入’s’导致useState更改状态,但是由于它是异步的,因此将使用旧的状态值来调用,

  • 我试图为web api控制器中的GET方法返回一个状态代码304 not modified。 我成功的唯一方法是这样的: 这里的问题是,它并不是一个例外,它只是没有被修改,所以客户端缓存是可以的。我还希望返回类型为User(正如所有web api示例使用GET显示的那样),而不是返回HttpResponseMessage或类似的内容。

  • 问题内容: 如果我返回一个对象: 状态代码将为200。如何将其更改为201,并显示一条消息并与json对象一起发送? 我不知道是否有一种方法可以在Laravel中设置状态代码。 问题答案: 您可以用来设置HTTP响应代码。 如果未传递任何参数,则http_response_code将获取当前状态码。如果您传递参数,它将设置响应代码。 对于Laravel:

  • 问题内容: 我正在将Spring Boot与基于@ResponseBody的方法结合使用,如下所示: 我尝试了一些典型的方法,例如: res.setStatus(HttpStatus.NOT_FOUND.value()); 新的ResponseEntity(HttpStatus.BAD_REQUEST); 但是我需要返回Response。 如果视频为空,如何在此处返回404状态代码? 问题答案: