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
。