【发布时间】:2019-06-24 22:45:54
【问题描述】:
我有一个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 object:
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();
我总是遇到异常:
原因:com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造
my.package.model.User$UserAddress$UserAddressBuilder的实例(尽管至少存在一个 Creator):没有 String-argument 构造函数/工厂方法可以从 String 值反序列化('" {\"street\":\"Some Street\",\"house_number\":\"Some House Number\"}')
由于字段匹配,我无法找到此问题的根源,不是吗?
我也尝试了不使用@Builder 的方法,并改用@Data、@AllArgsConstructor 和@NoArgsConstructor。
当使用readValue 而不是convertValue 时,我得到了相同的结果
【问题讨论】:
-
错误非常明确,您应该有一个构造函数,该构造函数将要反序列化的字符串作为构建器类中的参数。
-
我不认为我明白你的意思。我从这里得到了答案并实现了它:stackoverflow.com/questions/39381474/…
-
你应该使用
mapper.readValue(),而不是convertValue()。 -
我已经试过了。结果相同。
-
你的 UserAddressBuilder 类没有构造函数?