Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 龙目山+;杰克逊=>;不匹配计算异常_Java_Jackson_Lombok - Fatal编程技术网

Java 龙目山+;杰克逊=>;不匹配计算异常

Java 龙目山+;杰克逊=>;不匹配计算异常,java,jackson,lombok,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.f

我有一个
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;
            }
        }
    }
}
当我现在从
结果集
构建
用户
时:

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();
我总是有例外:

原因:com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造
my.package.model.User$UserAddress$UserAddressBuilder
(尽管至少存在一个创建者):没有字符串参数构造函数/工厂方法从字符串值反序列化(“{\'street\”:“Some street\”,“house\u number\:\”一些门牌号\“}”)

我找不到这个问题的根源,因为字段是匹配的,不是吗? 我还尝试了不使用
@Builder
的方法,而是使用
@Data
@allargsconstuctor
@noargsconstuctor


当使用
readValue
而不是
convertValue

时,我得到了与使用

.userAddress(mapper.readValue(rs.getString(SqlConstants.TableUser.USER_ADDRESS), 
                                              User.UserAddress.class))
至少对我来说应该可以正常工作。但是在进行更改后,您可能会遇到:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“房屋号”

(而不是原始错误),通过对您的
UserAddressBuilder
进行微小更改即可修复:

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

public T convertValue(对象从值、类到值类型)
抛出IllegalArgumentException

从给定值到给定值类型实例的两步转换的简便方法。这一功能相当于首先将给定值序列化为JSON,然后将JSON数据绑定为给定类型的值,但可以在不完全序列化为JSON的情况下执行。相同的转换器(序列化器、反序列化器)将用作数据绑定,这意味着相同的对象映射器配置工作


readValue
用于将字符串、流、读取器读入对象值您可能需要定义转换器,但在您的情况下不需要它。

错误非常明确,您应该有一个构造函数,将要反序列化的字符串作为生成器类中的参数。我不认为我理解您的意思。我从这里得到了答案并实现了它:您应该使用
mapper.readValue()
,而不是
convertValue()
。我已经尝试过了。结果是一样的。你的UserAddressBuilder类没有构造函数?我不明白为什么,但这解决了问题。我不理解
不匹配的PutException