Wildfly 10 管理休息 API

Wildfly 10 management Rest API

有人可以解释下面的代码吗?

我知道 RESTEasy 客户端和 Jersey AuthenticationFeature...但这意味着 SimpleOperation class 以及它是什么 API?

HttpAuthenticationFeature feature = HttpAuthenticationFeature.digest("admin", "admin");
Client client = ClientBuilder.newClient();
client.register(feature);
Entity<SimpleOperation> operation = Entity.entity(
    new SimpleOperation("read-resource", true, "subsystem", "undertow", "server", "default-server"),
    MediaType.APPLICATION_JSON_TYPE);
WebTarget managementResource = client.target("http://localhost:9990/management");
String response = managementResource.request(MediaType.APPLICATION_JSON_TYPE)
    .header("Content-type", MediaType.APPLICATION_JSON)
    .post(operation, String.class);
System.out.println(response);

来自:https://docs.jboss.org/author/display/WFLY10/The+HTTP+management+API

如果您找不到 SimpleOperation class 是什么,或者它只是为文档编造的 class,您可以自己创建一个。它只是一个简单的 POJO,JSON 序列化程序使用它来序列化到 JSON。如果您不熟悉 JSON/POJO 映射,这里有一些提示

  • JSON 对象(通常)映射到 Java POJO classes。所以 { } 会映射到

    class SomeClass
    
  • JSON 属性映射到 Java bean 属性。例如,如果您有一个 JSON 属性 firstName,那么您将需要一个带有 getter 和 setter 的字段,以及 getter 和 setter 匹配 JSON 属性 的名称(带 get/set 前缀且首字母大写)

    class SomeClass {
        private String firstName;
        public String getFirstName() { return firstName; }
        public void setFirstName(String firstName) { this.firstName = firstName }
    }
    

    因此,如果您要将 new SomeClass("Joao") 作为实体发送,它将序列化为

    {"firstName": "Joao"}
    

也就是说,如果您知道需要发送的 JSON 格式,那么创建您自己的 POJO 应该不会太难。

一些其他类型的映射:

  • JSON数组一般映射到List。所以如果你有 ["hello", "world"],你可以将它映射到 List<String>

  • 或者如果你有一个 JSON 数组 JSON 对象,例如 [{"prop":"value"}, {"prop":"value"}],你可以将它映射到 List<SomeType>

  • Boolean java 属性 getters 可以遵循更广泛的命名约定,即 getProperty, isProperty, hasProperty

这就是我能想到的基本知识。例如,查看您提供的 link 的示例请求之一

{
  "operation":"read-resource", 
  "include-runtime":"true",
  "recursive":"true", 
  "address":["subsystem","undertow","server","default-server"]
}

您可以将其映射到 POJO,例如

public class SimpleOperation {
    private String operation;
    @JsonProperty("include-runtime")
    private boolean includeRuntime;
    public boolean recursive;
    private List<String> address;

    public SimpleOperation(String operation, boolean includeRuntime, 
                          boolean recursive, String... address) {
        this.operation = operation;
        this.includeRuntime = includeRuntime;
        this.address = Arrays.asList(address);
    }

    // getters and setters.
}

@JsonProperty 是为了让 Jackson 序列化程序知道如何设置 JSON 属性 名称。它将默认脱离我上面提到的命名约定,但它不知道在名称中使用 -,因此我们明确告诉它 属性 名称应该是什么。

那么你可以

new SimpleOperation("read-resource", true, "subsystem", "undertow", "server", "default-server")

并且应该序列化为上面的JSON