我想让这个java代码工作:
RequestManager rm = Json.decodeValue(request.getBodyAsString(), RequestManager.class);
但我有这个错误:
io.vertx.core.json.DecodeException: Failed to decode:No suitable constructor found for type [simple type, class RequestManager]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)
at [Source: {"messageId":"fsdfsdf"}; line: 1, column: 2]
这是我班级的代码:
public class RequestManager {
private String messageId;
private String messageContent;
public RequestManager(String messageId, String messageContent) {
this.messageId = messageId;
this.messageContent = messageContent;
}
public String getMessageId() {
return messageId;
}
public String getMessageContent() {
return messageContent;
}
}
我真的不知道它为什么不起作用,关于它的问题很少,但它们无关紧要。
有人可以帮忙吗?
编辑 -
我知道有这样的RequestManager类:
public class RequestManager {
private String messageId;
private String messageContent;
public RequestManager(String messageId, String messageContent) {
this.messageId = messageId;
this.messageContent = messageContent + "check";
}
public RequestManager() {
}
public String getMessageId() {
return messageId;
}
public String getMessageContent() {
return messageContent;
}
public void setMessageId(String messageId) {
this.messageId = messageId;
}
public void setMessageContent(String messageContent) {
this.messageContent = messageContent;
}
}
但是当我尝试打印使用RequestManager
创建的JSON.decodeValue
对象的字段时,它会返回null。我已经在过去做过那个并且有同样的错误。我认为这是因为使用了空构造函数。
我还是不太懂......
编辑 - 2
我试图再次改变我的课程,这里是:
@JsonIgnoreProperties(ignoreUnknown=true)
public class RequestManager {
@JsonProperty("messageId") private String messageId;
@JsonProperty("messageContent") private String messageContent;
@JsonCreator
public RequestManager(@JsonProperty("messageId") String messageId, @JsonProperty("messageContent") String messageContent) {
this.messageId = messageId;
this.messageContent = messageContent;
System.out.println("This constructor is used.");
}
public RequestManager() {
}
public String getMessageId() {
return messageId;
}
public String getMessageContent() {
return messageContent;
}
public void setMessageId(String messageId) {
this.messageId = messageId;
}
public void setMessageContent(String messageContent) {
this.messageContent = messageContent;
}
}
这是我的主要内容:
final RequestManager rm = Json.decodeValue("{\"messageId\":\"themessage\"}", RequestManager.class);
System.out.println(rm.getMessageContent());
"{\"messageId\":\"themessage\"}"
= JSON格式,我很确定,因为如果不是,则decodeValue会返回一个Decode Exception。
现在打印时,该字段为“nullcheck”。所以这意味着构造函数使用得很好,但字段为空。我在哪里做错了?
答案 0 :(得分:0)
这是因为你有自己的构造函数,而JSON不知道应该将哪些值传递给它。
他们的GitHub页面上有文档,说明如何设置一个您希望以JSON形式提供给您并转换为Java的数据对象。
https://github.com/vert-x3/vertx-codegen#data-objects
根据您链接到http://vertx.io/blog/some-rest-with-vert-x/的示例,请注意他们如何显式提供不带参数的构造函数,以及公共setter方法
Whisky()
setName(String name)
setOrigin(String origin)
另一种方法是提供注释:https://github.com/FasterXML/jackson-annotations。您可以根据需要使用注释或使用 bean 类(getter和setter)来选择如何操作。注释的优势在于您可以说“转换为JSON时忽略此值”等等。您可以更明确地使用注释。 我建议选择一个并坚持下去。随着项目的增长,一致性变得非常重要。
答案 1 :(得分:0)
您可以尝试使用空构造函数。