如何针对Spring Actuator 2发布一个bean

时间:2018-03-08 10:34:19

标签: java spring spring-boot kotlin spring-boot-actuator

我是Spring Actuator 2的新手,并且即将放弃如何以JSON array([[ 52, 218, 255], [ 52, 218, 255], [ 52, 218, 255], ..., [ 52, 218, 255], [ 52, 218, 255], [ 52, 218, 255]]...], dtype=uint8) 形式对http://localhost:8080/actuator/fruits进行HTTP-POST实体,因为它让我失望了一个糟糕的请求:

{"fruit": {"id": 1, "name": "apple"}}

如果我发布JSON parse error: Cannot deserialize instance of 'java.lang.String' out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of 'java.lang.String' out of START_OBJECT token\n at [Source: (PushbackInputStream); line: 1, column: 11] (through reference chain: java.util.LinkedHashMap[\"fruit\"]) ,我也会收到{"fruit": "{\"id\": 1, \"name\": \"apple\"}"}的错误请求(当然,因为我的端点方法参数的类型为Parameter mapping failure而不是Fruit)。< / p>

我到目前为止发现的原因是杰克逊期望String最终通过java.util.Map<String, String>(通过某种反思)告诉org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping.OperationHandler#handle(javax.servlet.http.HttpServletRequest, Map<String, String>)(第二个参数是罪魁祸首)。

我的问题是:是否有一种很简单的方法可以使我的HTTP-POST端点接受Fruit(不接受String并明确解析它?)

附录

我的水果课(Kotlin):

data class Fruit(val id: Long, val name: String)

My Fruits类(翻译为Java):

public final class Fruit {
    private final Long id;
    private final String name;

    public Fruit(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    public final Long getId() { return id; }

    public final String getName() { return name; }
}

我的端点类:

@org.springframework.stereotype.Component
@org.springframework.boot.actuate.endpoint.annotation.Endpoint(id = "fruits")
class FruitsEndpoint() {
    @org.springframework.boot.actuate.endpoint.annotation.WriteOperation
    fun addFruit(fruit: Fruit) { println(fruit) }
}

My Endpoint类(翻译为Java):

@org.springframework.stereotype.Component
@org.springframework.boot.actuate.endpoint.annotation.Endpoint(id = "fruits")
public final class FruitsEndpoint {
    @org.springframework.boot.actuate.endpoint.annotation.WriteOperation
    public void addFruit(Fruit fruit) { System.out.println(fruit); }
}

1 个答案:

答案 0 :(得分:0)

如果您不打算expose a custom endpoint in a portable way,例如使用JMX,您可以使用Spring MVC和Spring WebFlux controller endpoints

  

控制器端点提供了与Spring的Web框架更深层次的集成,但代价是可移植性。