无法使用带有构建器模式的jackson 3+实例化POJO

时间:2015-06-30 15:05:34

标签: java json spring spring-mvc jackson

我有以下课程:

@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

有人知道我为什么会收到这个错误吗?

2 个答案:

答案 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

中使用它