首先要进行一些背景说明。
我有一个由许多客户端和执行各种功能的服务组成的应用程序。这些软件通过相互发送消息来相互通信。此时,消息结构非常简单且很小,消息类型的总数也相当小。有可能支持表示相关信息的“类型”,可能在消息类型之间共享。
几个简单的消息类型示例:
AssessRouteCommand {
header : HeaderType
commandID : string
}
AssessRouteStatus {
header : HeaderType
commandID : string
status : string
}
如您所见,这两个消息都具有相同类型的标头。 [ 理想情况下,我希望能够生成一个抽象的超类,所有“消息”类型都将从该超类扩展而来,但我不知道这是怎么回事(或者是否可以)使用JSON完成。 ]
HeaderType {
timestamp : long
securitySignature : SecuritySignatureType
}
SecuritySignatureType {
<security-specific properties>
}
我的意图是定义一个JSON模式来定义消息类型(以及内部消息组件的任何支持类型),然后生成代表这些类型的POJO的Java类的集合。 [ 我正在使用jsonschema2pojo(http://www.jsonschema2pojo.org/)来照顾POJO的产生。这是我发现的唯一一个可以从JSON模式生成POJO类的程序包。 ]
因此,我开始为此创建一个架构,并且认为我已经正确设置了它。但是,当我运行jsonschema2pojo来执行生成步骤时,事情不太正确。一些类已达到我的预期,而另一些却没有。
以下是我的架构摘录,以供参考。
sub-types.schema.json:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "http://<my domain>/sub-types.schema.json",
"type": "object",
"definitions": {
"security-signature": {
"type": "object",
"properties": {
"algorithm": {
"type": "string"
},
"key-value": {
"type": "string"
}
}
},
"message-header": {
"type": "object",
"properties": {
"timestamp": {
"type": "number"
},
"security-signature": {
"$ref": "#/definitions/security-signature"
}
}
}
}
}
message-type.schema.json:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "http://<my domain>/message-type.schema.json",
"type": "object",
"properties": {
"header": {
"$ref": "sub-types.schema.json#/definitions/message-header"
}
}
}
assess-route-command.schema.json:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "http://<my domain>/assess-route-command.schema.json",
"type": "object",
"properties": {
"allOf": [
{
"$ref": "message-type.schema.json#/definitions/header"
},
{
"type": "object",
"properties": {
"command-id": {
"type": "string"
}
}
}
]
}
}
这就是最终生成的内容(为简洁起见,省略了一些生成的代码):
MessageTypeSchema.java: (注意:出于某种原因,它在类名后附加了“模式”,这不是我想要的。)
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"header"
})
public class MessageTypeSchema {
@JsonProperty("header")
@Valid
private MessageHeader header;
@JsonProperty("header")
public MessageHeader getHeader() {
return header;
}
@JsonProperty("header")
public void setHeader(MessageHeader header) {
this.header = header;
}
...
}
MessageHeader.java: (注意:我不希望将JSON“数字”作为Java Double生成。我认为有一种方法可以控制它。)
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"timestamp",
"security-signature"
})
public class MessageHeader {
@JsonProperty("timestamp")
private Double timestamp;
@JsonProperty("security-signature")
@Valid
private SecuritySignature securitySignature;
...
}
SecuritySignature.java:
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"algorithm",
"key-value",
"key-length",
"sender"
})
public class SecuritySignature {
@JsonProperty("algorithm")
private String algorithm;
@JsonProperty("key-value")
private String keyValue;
@JsonProperty("key-length")
private Double keyLength;
@JsonProperty("sender")
private String sender;
...
}
AssessRouteCommandSchema.java: (这里的东西很糟糕。)
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"allOf"
})
public class AssessRouteCommandSchema {
@JsonProperty("allOf")
private Object allOf;
@JsonProperty("allOf")
public Object getAllOf() {
return allOf;
}
@JsonProperty("allOf")
public void setAllOf(Object allOf) {
this.allOf = allOf;
}
...
}
这根本不是我想要的。
如果任何人都可以了解我在做什么错,请告诉我。了解我是否可以影响类的命名方式以及是否可以控制为属性生成的Java类型,这也将很有帮助。