方法:开头/刷新返回500

时间:2017-02-21 17:35:28

标签: spring-boot

/刷新端点被添加,暴露,我可以直接调用,但它不能通过HTTP方法头获得?

2017-02-21 15:00:08.913 INFO [ - ,,,] 4597 --- [main] osbaemvc.EndpointHandlerMapping:映射“{[/ refresh || / refresh。 json],methods = [POST]}“on public java.lang.Object org.springframework.cloud.endpoint.GenericPostableMvcEndpoint.invoke()

例外:

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

4 个答案:

答案 0 :(得分:1)

我认为只有在您的微服务中有@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)

...

在这里,你是另一个,但在这种情况下,没有@RestController

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

答案 1 :(得分:1)

我能够通过以下方式解决这个问题:

@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);
    }
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这是Spring Boot Actuator中的错误。当管理端口与服务器端口不同时,管理将保留而没有DefaultHandlerExceptionResolver,该函数负责在不允许该方法时返回错误405。

这会在Spring Boot Admin中引起问题,因为在某些情况下而不是其他情况,它期望错误405。它使用HEAD方法验证端点是否存在。用正确的方法调用端点将执行代码,其目的只是验证它是否存在。

https://github.com/spring-projects/spring-boot/issues/14084