当前位置: 首页 > 知识库问答 >
问题:

为什么Jackson ObjectMapper无法序列化play.data.validation.ValidationError类?

皇甫德庸
2023-03-14

我有以下设置:


public class ValidationUtils {

  public static class ValidationResults {
      public List validationErrors;
      public boolean valid;

      public ValidationResults(){
        validationErrors = new ArrayList();
        valid = true;
    }

      @Override
      public String toString() {
        return "ValidationResults [validationErrors=" + validationErrors
                    + ", valid=" + valid + "]";
      }
  }

  // some static methods that create instances of ValidationResults.
}

ValidationResults类序列化后,我收到以下错误:

com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class play.data.validation.ValidationError and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: utils.ValidationResults["validationErrors"]->java.util.ArrayList[0])

我使用play.libs.Json实用程序类,它只是Jackson对象映射器的包装器。有人知道问题是什么吗?我如何解决这个问题?

ValidationError类的结构如下:


package play.data.validation;

import java.util.*;

import com.google.common.collect.ImmutableList;

/**
 * A form validation error.
 */
public class ValidationError {

    private String key;
    private String message;
    private List arguments;

    /**
     * Constructs a new ValidationError.
     *
     * @param key the error key
     * @param message the error message
     */
    public ValidationError(String key, String message) {
        this(key, message, ImmutableList.of());
    }

    /**
     * Constructs a new ValidationError.
     *
     * @param key the error key
     * @param message the error message
     * @param arguments the error message arguments
     */
    public ValidationError(String key, String message, List arguments) {
        this.key = key;
        this.message = message;
        this.arguments = arguments;
    }

    /**
     * Returns the error key.
     */
    public String key() {
        return key;
    }

    /**
     * Returns the error message.
     */
    public String message() {
        return message;
    }

    /**
     * Returns the error arguments.
     */
    public List arguments() {
        return arguments;
    }

    public String toString() {
        return "ValidationError(" + key + "," + message + "," + arguments + ")";
    }

}

共有1个答案

魏健柏
2023-03-14

ValidationError的字段访问器方法既不遵循JavaBean约定,也不使用@JsonProperty注释进行注释,因此Jackson无法识别它们。

下面是一个使用更新的方法名稍微修改的类的工作示例:

public class JacksonGetters {
    public static class ValidationError {

        private String key;
        private String message;
        private List arguments;

        /**
         * Constructs a new ValidationError.
         *
         * @param key the error key
         * @param message the error message
         */
        public ValidationError(String key, String message) {
            this(key, message, null);
        }

        /**
         * Constructs a new ValidationError.
         *
         * @param key the error key
         * @param message the error message
         * @param arguments the error message arguments
         */
        public ValidationError(String key, String message, List arguments) {
            this.key = key;
            this.message = message;
            this.arguments = arguments;
        }

        /**
         * Returns the error key.
         */
        public String getKey() {
            return key;
        }

        /**
         * Returns the error message.
         */
        public String getMessage() {
            return message;
        }

        /**
         * Returns the error arguments.
         */
        public List getArguments() {
            return arguments;
        }

        public String toString() {
            return "ValidationError(" + key + "," + message + "," + arguments + ")";
        }

    }

    public static void main(String[] args) throws JsonProcessingException {
        ValidationError err = new ValidationError("key", "message");
        ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(err));
    }

}

输出:

{
  "key" : "key",
  "message" : "message",
  "arguments" : null
}
 类似资料:
  • 问题内容: 经过数小时的搜索,我终于意识到java.sql.ResultSet无法序列化,也没有办法。我尝试添加到列表中,作为Serializable对象和其他内容中的实例变量,但事实证明这只是幼稚而绝望的尝试。我试图使用的实现的RowSet像对CachedRowSetImpl是序列化,但它们增加了响应时间,最有可能是因为他们迭代ResultSet中。最重要的是,除非选择迭代ResultSet,否

  • 除非缓存放入是内部的,否则此代码路径中不会发生缓存放入。我提到这一点是因为另一篇文章的评论,即“未知对”可能是由错误类型的缓存放置造成的。 我正专注于 未能反序列化对象[typename=org.apache.ignite.internal.processors.closure.gridclosureprocessor$C2]

  • 问题内容: 如下代码: 引发以下异常: 我猜内部类具有一个允许对其私有访问的字段和方法的字段。声明内部类static 可以解决它,但是如果需要此访问权限怎么办?有没有一种方法可以在不包含封闭类的情况下序列化非静态内部类,例如通过引用外部类? 编辑:例如,仅在序列化之前才需要访问外部类。好的,编译器不知道这一点,但是我认为这就是关键字存在的原因。 问题答案: 如果InnerClass需要此访问权限怎

  • 我试图在Java中序列化,但在运行我的程序时,我收到一个。 查看类,我注意到它没有实现。 为什么不实现?

  • 问题内容: 我试图序列化和反序列化内部对象的数组列表: HairList对象也是一个可序列化的对象。 此代码执行返回以下错误: 排队 我不知道我在做什么错。你能给个小费吗? 更新: 解决: 仅使用HairBirt的本机数组而不是ArrayList即可工作: 代替 感谢大家的帮助。 问题答案: 不要使用-而是使用二进制数据并对它进行base64编码,以将其转换为字符串而不会丢失信息。 我强烈怀疑这是

  • 本文向大家介绍什么是序列化与反序列化?相关面试题,主要包含被问及什么是序列化与反序列化?时的应答技巧和注意事项,需要的朋友参考一下 序列化:将对象状态转换为可保持或传输的格式的过程。将对象实例的字段及类的名称转换成字节流,然后把字节流写入数据流 反序列化:将流转换为对象。 这两个过程结合起来,可以轻松地存储和传输数据。