我是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); }
}
答案 0 :(得分:0)
如果您不打算expose a custom endpoint in a portable way,例如使用JMX,您可以使用Spring MVC和Spring WebFlux controller endpoints。
控制器端点提供了与Spring的Web框架更深层次的集成,但代价是可移植性。