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 )