Spring boot 方法:正面/刷新返回500

Spring boot 方法:正面/刷新返回500,spring-boot,Spring Boot,/刷新端点已添加、公开,我可以直接调用,但无法通过HTTP方法头使用它 2017-02-21 15:00:08.913 INFO[-,,]4597-[main]o.s.b.a.e.mvc.EndpointHandlerMapping:将“{[/refresh | |/refresh.json],methods=[POST]}”映射到公共java.lang.Object org.springframework.cloud.endpoint.GenericPostablevcEndpoint.inv

/刷新端点已添加、公开,我可以直接调用,但无法通过HTTP方法头使用它

2017-02-21 15:00:08.913 INFO[-,,]4597-[main]o.s.b.a.e.mvc.EndpointHandlerMapping:将“{[/refresh | |/refresh.json],methods=[POST]}”映射到公共java.lang.Object org.springframework.cloud.endpoint.GenericPostablevcEndpoint.invoke()上

例外情况:

org.springframework.web.HttpRequestMethodNotSupportedException:不支持请求方法'HEAD'
在org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:20

中,我认为只有当您的微服务中有一个
@RestController
时,这个问题才会发生

正如我所看到的,这里是带有
@RestController
的微服务中的差异句柄:

2017-02-22 13:54:38.382 **ERROR** [micro-service-1,e9a053f5ffa72714,3980777f97a147f9,true] 10956 --- [http-nio-auto-3-exec-1] c.s.e.c.e.DefaultExceptionHandler
: ErrorResponse [errorCode=90000, description=Request method 'HEAD' not supported, correlationId=e9a053f5ffa72714, externalErrorCode=null, additionalProperties={}]

org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'HEAD' not supported
    at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:207)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:374)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:314)

...
2017-02-22 15:14:49.795  **WARN** [micro-service-2,897590499c7c776c,
74a8108edccafb5e,true]    27623 --- [http-nio-auto-2-exec-5]
o.s.web.servlet.PageNotFound     : Request method 'HEAD' not supported
这里是另一个,但在本例中,没有
@RestController

2017-02-22 13:54:38.382 **ERROR** [micro-service-1,e9a053f5ffa72714,3980777f97a147f9,true] 10956 --- [http-nio-auto-3-exec-1] c.s.e.c.e.DefaultExceptionHandler
: ErrorResponse [errorCode=90000, description=Request method 'HEAD' not supported, correlationId=e9a053f5ffa72714, externalErrorCode=null, additionalProperties={}]

org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'HEAD' not supported
    at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:207)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:374)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:314)

...
2017-02-22 15:14:49.795  **WARN** [micro-service-2,897590499c7c776c,
74a8108edccafb5e,true]    27623 --- [http-nio-auto-2-exec-5]
o.s.web.servlet.PageNotFound     : Request method 'HEAD' not supported

fran谢谢你说得对,这解决了问题,因为类有一个@ExceptionHandler(Exception.class),它通过返回500来处理未指定的异常,并将其视为内部服务器错误。在通知中将HttpRequestMethodNotSupportedException显式定义为@ExceptionHandler,并使用默认的执行器JSON响应来处理它(405)正如spring boot管理员所期望的,一切正常。

我通过以下方法解决了这个问题:

@Component
public class ActuatorHeadEndpoint extends EndpointMvcAdapter {

    public ActuatorHeadEndpoint(RefreshEndpoint delegate) {
        super(delegate);
    }

    @RequestMapping(method = RequestMethod.HEAD)
    @ResponseBody
    @Override
    public Object invoke() {
        if (!getDelegate().isEnabled()) {
            return new ResponseEntity<>(Collections.singletonMap(
                "message", "This endpoint is disabled"), HttpStatus.NOT_FOUND);
        }
        return new ResponseEntity<>("", HttpStatus.METHOD_NOT_ALLOWED);
    }
}
@组件
公共类ActuatorHeadEndpoint扩展EndpointMvcAdapter{
公共启动器HeadEndpoint(刷新端点委托){
超级(代表);
}
@RequestMapping(method=RequestMethod.HEAD)
@应答器
@凌驾
公共对象调用(){
如果(!getDelegate().isEnabled()){
返回新的响应属性(Collections.singletonMap)(
“消息”、“此终结点已禁用”)、HttpStatus.NOT_FOUND);
}
返回新的响应属性(“,HttpStatus.METHOD\u不允许);
}
}

这是Spring Boot Actuator中的一个错误。当管理端口与服务器端口不同时,管理层将保留DefaultHandlerExceptionResolver,当不允许该方法时,它负责返回错误405

这会导致Spring Boot Admin出现问题,因为它在某些情况下会出现错误405,而不是其他任何情况。它使用HEAD方法来验证终结点是否存在。使用正确的方法调用终结点将执行代码,其目的只是验证它是否存在


映射日志显示,
/refresh
POST
下注册,而不是
HEAD
下注册。能否提供有关如何公开此端点的代码片段?这是一个由libraray在内部公开的执行器端点。