java - Lombok + Jackson => MismatchedInputException

标签 java jackson lombok

我有一个 PSQL 表,其中一列包含 jsonb 数据:

CREATE TABLE IF NOT EXISTS user (
    user_name VARCHAR(255) NOT NULL,
    user_email VARCHAR(255) NOT NULL,
    user_address jsonb NOT NULL
)

我有以下java对象:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import lombok.Builder;
import lombok.Value;

@Value
@Builder
public class User {
    private String userName;
    private String userEmail;
    private UserAddress address;

    @Value
    @Builder
    @JsonDeserialize(builder = UserAddress.UserAddressBuilder.class)
    public static class UserAddress {
        @JsonProperty("street")
        private String street;
        @JsonProperty("house_number")
        private String houseNumber;

        @JsonPOJOBuilder(withPrefix = "")
        public static class UserAddressBuilder {
            private String street = null;
            private String houseNumber = null;

            public UserAddressBuilder street(String street) {
               this.street = street;

               return this;
            }

            public UserAddressBuilder houseNumber(String houseNumber) {
                this.houseNumber = houseNumber;

                return this;
            }
        }
    }
}

当我现在从 ResultSet 构建 User 时:

return User.builder()
        .userName(rs.getString(SqlConstants.TableUser.USER_NAME))
        .userEmail(rs.getString(SqlConstants.TableUser.USER_EMAIL))
        .userAddress(mapper.convertValue(rs.getString(SqlConstants.TableUser.USER_ADDRESS), User.UserAddress.class))
        .build();

我总是遇到异常:

Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of my.package.model.User$UserAddress$UserAddressBuilder (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('"{\"street\":\"Some Street\",\"house_number\":\"Some House Number\"}')

我找不到这个问题的根源,因为字段是匹配的,不是吗? 我还尝试了没有 @Builder 的方法,并使用 @Data@AllArgsConstructor@NoArgsConstructor 代替。 p>

使用 readValue 而不是 convertValue 时得到相同的结果

最佳答案

正如评论中提到的使用

.userAddress(mapper.readValue(rs.getString(SqlConstants.TableUser.USER_ADDRESS), 
                                              User.UserAddress.class))

应该工作得很好,至少对我来说是这样。但是,在进行更改之后,您可能会遇到:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "house_number" ...

(而不是原来的错误),这将通过对您的 UserAddressBuilder 进行小的更改来修复:

@JsonProperty("house_number") // this is also needed to map correctly
public UserAddressBuilder houseNumber(String houseNumber) { ...

来自Javadoc :

public T convertValue(Object fromValue, Class toValueType)
throws IllegalArgumentException

Convenience method for doing two-step conversion from given value, into instance of given value type. This is functionality equivalent to first serializing given value into JSON, then binding JSON data into value of given type, but may be executed without fully serializing into JSON. Same converters (serializers, deserializers) will be used as for data binding, meaning same object mapper configuration works

readValue用于从字符串、流、读取器读取对​​象值。使用 convertValue(..) 您可能需要定义转换器,但在您的情况下不需要。

关于java - Lombok + Jackson => MismatchedInputException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54461166/

相关文章:

Java程序通过调用C代码实现矩阵相乘

java - 将数组列表添加到 session 中

java - 当 JsonProperty 属性不同时如何打印对象 json?

java - 自定义 Lombok super builder

java - 标签对齐行为很奇怪

java - 查找字符串是否存在于数组中

exception - 为什么 kotlin jackson 不能反序列化列表

java - 将 Java 对象转换为 JsonNode,并根据请求更改 SerializationConfig

java - jackson : "(although at least one Creator exists): no String-argument constructor/factory method to deserialize"

java - Lombok 创建多个 setter