0

我有一个类似于下面的类层次结构,具有自定义Converter

FieldValueConverter#deserialize我的JerseyTest. 相反,它使用默认的 GensonJsonConverter 抱怨找不到合适的构造函数。( Caused by: com.owlike.genson.JsonBindingException: No constructor has been found for type class com.searchdata.actions.api.FieldValue)

我怎样才能使用它?

登记

s的转换器FieldValue(见下文),我在 Jersey 中注册,Application如下所示:

    Genson genson = new GensonBuilder()
            .withBundle(new JAXBBundle())
            .withConverter(new FieldValueConverter(), FieldValue.class)
            .setSkipNull(true)
            .create();



    register(new GensonJaxRSFeature().use(genson));

字段值转换器

public class FieldValueConverter implements Converter<FieldValue> {

    private static final Logger LOG = LoggerFactory.getLogger(FieldValueConverter.class);


    public void serialize(FieldValue fieldValue, ObjectWriter writer, Context ctx) throws Exception {

        LOG.info("Serializing fieldValue:{}", fieldValue);
        writer.beginObject();
        writer.writeString("type", fieldValue.getType().name())
                .writeString("value", fieldValue.getValue().toString())
                .writeString("field", fieldValue.getField());
        writer.endObject();
        LOG.info("..Done!", fieldValue);
    }

    /* You don't have to worry for the object being null here, if it is null Genson will
    handle it for you. */
    public FieldValue deserialize(ObjectReader reader, Context ctx) throws Exception {

        LOG.info("Deserializing fieldValue...");

        reader.beginObject();

        String stringValue=null;
        FieldType type= FieldType.STRING;
        String fieldKey= null;

        while (reader.hasNext()) {
            reader.next();
            if ("type".equals(reader.name())) {
                type = FieldType.valueOf(reader.valueAsString());
            } else if ("field".equals(reader.name())) {
                fieldKey = reader.valueAsString();
            } else if ("value".equals(reader.name())) {
                stringValue = reader.valueAsString();
            } else {
                reader.skipValue();
            }
        }

物品

public class Item
{
    @Schema(name = "id", description = "The id of an item")
    private String id;

    @Schema(name = "values", description = "The fields with values for this action")
    private List<FieldValue> values;

}

字段值

@Schema(name = "FieldValue")
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
public class FieldValue {

    @Schema(name = "field", description = "The technical name of the field")
    private String field;

    @Schema(name = "type", description = "The type of the field")
    private FieldType type;

    @Schema(name = "value", description = "The value of a field", oneOf = {Integer.class, String.class, Date.class, Double.class})
    private Serializable value;


    public FieldValue(final String field, final String string) {
        setField(field);
        setValue(string);
        setType(FieldType.STRING);
    }

    public FieldValue(final String field, final Long number) {
        setField(field);
        setValue(number);
        setType(FieldType.LONG);
    }
4

0 回答 0