1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/redkale-redkale

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
convert.md 10 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 29.11.2024 11:56 84b3ad0

childFactory = jsonRootFactory.createChild();

childFactory.register(UserSimpleInfo.class, false, "regtime", "regaddr"); //разрешить вывод времени регистрации и адреса регистрации

childFactory.reloadCoder(UserSimpleInfo.class); //перезагрузить Coder, чтобы он перекрыл конфигурацию родительского Factory

this.detailConvert = childFactory.getConvert(); }

// Получить основную информацию о другом человеке @HttpMapping(url = "/user/info/") public void info(HttpRequest req, HttpResponse resp) throws IOException { int userid = Integer.parseInt(req.getRequstURILastPath()); UserSimpleInfo user = service.findUserInfo(userid); resp.finishJson(user); // не содержит поля информации о времени регистрации и адресе регистрации пользователя }

//Получить информацию о себе @HttpMapping(url = "/user/myinfo") public void mydetail(HttpRequest req, HttpResponse resp) throws IOException { int userid = req.currentUser().getUserid(); //получить текущий идентификатор пользователя UserSimpleInfo user = service.findUserInfo(userid); resp.finishJson(detailConvert, user); // содержит время регистрации и адрес регистрации пользователя }   Convert поддерживает конструкторы с параметрами.

    1. public конструктор с параметрами и аннотация @ConstructorParameters:

public class UserRecord {

    private int userid;

    private String username = "";

    private String password = "";

    @ConstructorParameters({"userid", "username", "password"})
    public UserRecord(int userid, String username, String password) {
        this.userid = userid;
        this.username = username;
        this.password = password;
    }

    public int getUserid() {
        return userid;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }
}

    2. Пользовательский Creator:

public class UserRecord {

    private int userid;

    private String username = "";

    private String password = "";

    UserRecord(int userid, String username, String password) {
        this.userid = userid;
        this.username = username;
        this.password = password;
    }

    public int getUserid() {
        return userid;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    /**
     * Пользовательский метод Creator.
     * 1) Имя метода может быть любым.
     * 2) Метод должен быть статическим.
     * 3) Параметры метода должны быть пустыми.
     * 4) Тип возвращаемого значения метода должен быть Creator.
     *
     * @return
     */
    private static Creator<UserRecord> creator() {
        return new Creator<UserRecord>() {
            @Override
            @ConstructorParameters({"userid", "username", "password"}) //конструктор с параметрами должен иметь аннотацию ConstructorParameters
            public UserRecord create(Object... params) {
                int userid = (params[0] == null ? 0 : (Integer) params[0]);
                return new UserRecord(userid, (String) params[1], (String) params[2]);
            }
        };
    }
}
  

  Обычно классы JavaBean по умолчанию имеют открытый конструктор без параметров, поэтому в большинстве случаев не нужно создавать Creator, на самом деле Convert автоматически поддерживает все, кроме закрытых конструкторов без параметров. Только если у вас есть закрытый конструктор без параметров, вам нужно создать Creator. Конструктор с параметрами требует аннотации @ConstructorParameters, что часто встречается в Immutable Object.

Пользовательский

  Convert поддерживает пользовательские Decode и Encode.

    1. Явная регистрация через ConvertFactory:

public class FileSimpleCoder<R extends Reader, W extends Writer> extends SimpledCoder<R, W, File> {

    public static final FileSimpleCoder instance = new FileSimpleCoder();

    @Override
    public void convertTo(W out, File value) {
        out.writeString(value == null ? null : value.getPath());
    }

    @Override
    public File convertFrom(R in) {
        String path = in.readString();
        return path == null ? null : new File(path);
    }
}

JsonFactory.root().register(File.class, FileSimpleCoder.instance);

ProtobufFactory.root().register(File.class, FileSimpleCoder.instance);

    2. Автоматическая загрузка через статический метод JavaBean:

public class InnerCoderEntity {

    private final String val;

    private final int id;

    private InnerCoderEntity(int id, String value) {
        this.id = id;
        this.val = value;
    }

    public static InnerCoderEntity create(int id, String value) {
        return new InnerCoderEntity(id, value);
    }

    /**
     * Данный метод предназначен для автоматической загрузки в компонент Convert.

* 1) Имя метода может быть любым.
* 2) Метод должен быть статическим.
* 3) У метода должен быть один параметр, который обязательно должен быть типа org.redkale.convert.ConvertFactory или его подкласса.
    * 3.1) Если тип параметра  org.redkale.convert.ConvertFactory, то метод подходит для JSON и PROTOBUF.
     * 3.2) Если тип параметра  org.redkale.convert.json.JsonFactory, то метод подходит только для JSON.
     * 3.3) Если тип параметра  org.redkale.convert.pb.ProtobufFactory, то метод подходит только для PROTOBUF.
* 4) Тип возвращаемого значения метода должен быть Decodeable/Encodeable/SimpledCoder.
   Если возвращаемый тип не SimpledCoder, то необходимо предоставить два метода: один возвращает Decodeable, другой  Encodeable.

@param factory
@return

private static SimpledCoder<Reader, Writer, InnerCoderEntity> createConvertCoder(final ConvertFactory factory) { return new SimpledCoder<Reader, Writer, InnerCoderEntity>() {

    // Необходимо с EnMember[] соблюдать последовательность
    private final DeMember[] deMembers = new DeMember[]{
        DeMember.create(factory, InnerCoderEntity.class, "id"),
        DeMember.create(factory, InnerCoderEntity.class, "val")};

    //Необходимо с DeMember[] соблюдать последовательность
    private final EnMember[] enMembers = new EnMember[]{
        EnMember.create(factory, InnerCoderEntity.class, "id"),
        EnMember.create(factory, InnerCoderEntity.class, "val")};

    @Override
    public void convertTo(Writer out, InnerCoderEntity value) {
        if (value == null) {
            out.writeObjectNull(InnerCoderEntity.class);
            return;
        }
        out.writeObjectB(value);
        for (EnMember member : enMembers) {
            out.writeObjectField(member, value);
        }
        out.writeObjectE(value);
    }

    @Override
    public InnerCoderEntity convertFrom(Reader in) {
        if (!in.readObjectB(this)) {
            return null;
        }
        int index = 0;
        final Object[] params = new Object[deMembers.length];
        while (in.hasNext()) {
            DeMember member = in.readFieldName(deMembers); // Чтение поля
            in.readBlank(); // Чтение разделителя между именем поля и значением поля, в JSON это пропуск двоеточия:
            if (member == null) {
                in.skipValue(); // Пропуск несуществующего значения поля, обычно не происходит
            } else {
                params[index++] = member.read(in);
            }
        }
        in.readObjectE();
        return InnerCoderEntity.create(params[0] == null ? 0 : (Integer) params[0], (String) params[1]);
    }
};

}

public int getId() { return id; }

public String getVal() { return val; }

@Override public String toString() { return JsonConvert.root().convertTo(this); } } RestConvertBean.class, onlyColumns = "id") public RestConvertBean load3() { return createBean(); }

//输出: {"content":{"createTime":100},"enable":1,"id":123,"name":"haha"}
//enable字段输出1,而不是true
@RestConvertCoder(type = RestConvertBean.class, field = "enable", coder = RestConvertBoolCoder.class)
public RestConvertBean load4() {
    return createBean();
}

private RestConvertBean createBean() {
    RestConvertBean bean = new RestConvertBean();
    bean.setId(123);
    bean.setName("haha");
    bean.setEnable(true);
    RestConvertItem item = new RestConvertItem();
    item.setCreateTime(100);
    item.setAesKey("keykey");
    bean.setContent(item);
    return bean;
}

}


Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/redkale-redkale.git
git@api.gitlife.ru:oschina-mirror/redkale-redkale.git
oschina-mirror
redkale-redkale
redkale-redkale
main