我有以下课程:
@JsonDeserialize(builder = Article.Builder.class)
public class Article {
private final String id;
private final String headline;
private Article(final Builder builder) {
this.id = checkNotNull(builder.id);
this.headline = checkNotNull(builder.headline);
}
@Nonnull
public String getId() {
return id;
}
@Nonnull
public String getHeadline() {
return headline;
}
public static Builder builder() {
return new Builder();
}
@JsonPOJOBuilder(buildMethodName = "build", withPrefix = "")
public static class Builder {
private String id;
private String headline;
public Builder id(final String id) {
this.id = id;
return this;
}
public Builder headline(final String headline) {
this.headline = headline;
return this;
}
public Article build() {
return new Article(this);
}
}
}
使用这些注释,我可以使用Jackson ObjectMapper序列化和反序列化对象,但在以下控制器中使用Article时收到错误:
@RequestMapping(value = "/article/{category}", method = PUT)
public void receiveArticle(@PathVariable("category") final String category, final Article article) {
service.createOrUpdateArticle(category, article);
}
使用此URL调用它:
http://localhost:8080/article/cat_1/?article={"id":"aid001","headline":"this is the headline"}
这是错误:
HTTP Status 500 - Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.example.Article]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.example.Article.<init>()
java.lang.NoSuchMethodException: com.example.Article.<init>()
java.lang.Class.getConstructor0(Class.java:2892)
...
我按照本教程使用了构建器模式:http://wiki.fasterxml.com/JacksonFeatureBuilderPattern
有人知道我为什么会收到这个错误吗?
答案 0 :(得分:3)
Spring不会使用JSON反序列化为您的处理程序方法生成参数。
&&
您目前拥有它的方式,@RequestMapping(value = "/article/{category}", method = PUT)
public void receiveArticle(@PathVariable("category") final String category, final Article article) {
service.createOrUpdateArticle(category, article);
}
参数被解释为模型属性,就像它使用Article
注释一样。 Spring将尝试使用无参数构造函数来实例化该类。由于您的@ModelAttribute
类没有提供,因此失败。
而是将JSON移动到请求正文,在请求中发送Article
标头,并使用Content-Type: application/json
为您的参数添加注释。
@RequestBody
答案 1 :(得分:0)
build()方法必须放在Warning: Missing argument 4 for graphene_page_ancestor_class() in /homepages/33/d95215500/htdocs/DC-Canyon/wp-content/themes/graphene/includes/theme-menu.php on line 184
类中,并且您已在Builder
类