@Data
@NoArgsConstructor
public class MiniDTOResponse extends EmptyDTOResponse {
private boolean exists;
}
@Data
public class ServicesDTOResponse extends MiniDTOResponse {
private boolean light;
private ToiletDTOResponse toilets;
private int barCounterNumber;
}
@Data
public class ToiletDTOResponse extends MiniDTOResponse {
private int numMaleRestrooms;
private int numFemaleRestrooms;
}
@Data
public class VIPDTOResponse extends MiniDTOResponse {
private int numVIPSeats;
private boolean isAccesible;
}
< /code>
и т. Д.@Data
@EqualsAndHashCode(callSuper = true)
public class BasicDTOResponse extends BasicDTO {
private Date dateDeletion;
private String userDeletion;
}
@Data
public class AttendanceDTOResponse extends BasicDTOResponse {
private int numStanding;
private int numSeats;
private ServicesDTOResponse services;
private VIPDTOResponse vip;
}
< /code>
и разные карт-карт-карт для каждого DTO. < /p>
Моя цель-вернуть что-то вроде этого, предполагая, что есть услуги и туалеты, но нет VIP < /p>
{
"id": "39F47F8B83F5653CE0631F1EA8C0D44F",
"dateDeletion": null,
"userDeletion": null,
"numStanding": 30000,
"numSeats": 20000,
"services": {
"exists": true,
"light": false,
"toilets": {
"exists": true,
"numMaleRestrooms" : 5,
"numFemaleRestrooms" : 6
},
"barCounterNumber": 6,
},
"vip": {
"exists": false,
"numVIPSeats": 0,
"isAccesible": false,
}
}
< /code>
Итак, я создал это < /p>
@Mapper(componentModel = "spring")
public interface GenericMapper {
default boolean exists(String id) {
return StringUtils.isNotBlank(id);
}
default boolean active(ZonedDateTime dateDeletion) {
return dateDeletion == null;
}
default boolean computeExists(BaseEntity entity) {
return entity != null && exists(entity.getId()) && active(entity.getFechaBaja());
}
@AfterMapping
default void setExists(@MappingTarget T dto, K entity) {
boolean exists = computeExists(entity);
dto.setExists(hay);
}
@ObjectFactory
default T createDto(K source, @TargetType Class dtoClass) {
try {
T dto = dtoClass.getDeclaredConstructor().newInstance();
setExists(dto, source);
return dto;
} catch (Exception e) {
throw new RuntimeException("Couldn't create DTO", e);
}
}
default T createDTOwithExitsFalse(Class dtoClass) {
try {
T dto = dtoClass.getDeclaredConstructor().newInstance();
dto.setExists(false);
return dto;
} catch (Exception e) {
throw new RuntimeException("Couldn't create DTO", e);
}
}
}
public interface AttendanceMapper extends GenericMapper {
@Mapping(target = "numStanding", source = "standing")
@Mapping(target = "numSeats", source = "seats")
@Mapping(target = "services", source = "installations", defaultExpression = "java(createDTOwithExitsFalse(ServicesDTOResponse.class))")
@Mapping(target = "vip", source= "vipFacilities", defaultExpression = "java(createDTOwithExitsFalse(VIPDTOResponse.class))")
AttendanceDTOResponse toDto (Attendance source);
}
< /code>
и работает как очарование без необходимости писать много дефолтов на каждом карте.Ambiguous factory methods found for creating ServicesDTOResponse: T createDto(K source, @TargetType Class dtoClass), T ToiletMapper.createDto(K source, @TargetType Class dtoClass). See https://mapstruct.org/faq/#ambiguous for more info.
, поскольку они оба расширяют GenericMapper.
Что я могу сделать? Я бы хотел сделать это агенерным способом, так как есть 40 DTORSPONES. Может быть, есть более чистый способ разрешения существуют и дефолт каждого атрибута без использования выражений, я готов узнать, как это сделать!
У меня есть несколько класса DTORSPONSE, каждый из которых расширяет MinidTorSponse. < /p> [code]@Data @NoArgsConstructor public class MiniDTOResponse extends EmptyDTOResponse { private boolean exists; }
@Data public class ServicesDTOResponse extends MiniDTOResponse { private boolean light; private ToiletDTOResponse toilets; private int barCounterNumber; } @Data public class ToiletDTOResponse extends MiniDTOResponse { private int numMaleRestrooms; private int numFemaleRestrooms; } @Data public class VIPDTOResponse extends MiniDTOResponse { private int numVIPSeats; private boolean isAccesible; } < /code> и т. Д.@Data @EqualsAndHashCode(callSuper = true) public class BasicDTOResponse extends BasicDTO { private Date dateDeletion; private String userDeletion; }
@Data public class AttendanceDTOResponse extends BasicDTOResponse { private int numStanding; private int numSeats; private ServicesDTOResponse services; private VIPDTOResponse vip; }
< /code> и разные карт-карт-карт для каждого DTO. < /p> Моя цель-вернуть что-то вроде этого, предполагая, что есть услуги и туалеты, но нет VIP < /p> { "id": "39F47F8B83F5653CE0631F1EA8C0D44F", "dateDeletion": null, "userDeletion": null, "numStanding": 30000, "numSeats": 20000, "services": { "exists": true, "light": false, "toilets": { "exists": true, "numMaleRestrooms" : 5, "numFemaleRestrooms" : 6 }, "barCounterNumber": 6, }, "vip": { "exists": false, "numVIPSeats": 0, "isAccesible": false, } } < /code> Итак, я создал это < /p> @Mapper(componentModel = "spring") public interface GenericMapper {
@AfterMapping default void setExists(@MappingTarget T dto, K entity) { boolean exists = computeExists(entity); dto.setExists(hay); }
@ObjectFactory default T createDto(K source, @TargetType Class dtoClass) { try { T dto = dtoClass.getDeclaredConstructor().newInstance(); setExists(dto, source); return dto; } catch (Exception e) { throw new RuntimeException("Couldn't create DTO", e); } }
default T createDTOwithExitsFalse(Class dtoClass) { try { T dto = dtoClass.getDeclaredConstructor().newInstance(); dto.setExists(false); return dto; } catch (Exception e) { throw new RuntimeException("Couldn't create DTO", e); } } }
public interface AttendanceMapper extends GenericMapper { @Mapping(target = "numStanding", source = "standing") @Mapping(target = "numSeats", source = "seats") @Mapping(target = "services", source = "installations", defaultExpression = "java(createDTOwithExitsFalse(ServicesDTOResponse.class))") @Mapping(target = "vip", source= "vipFacilities", defaultExpression = "java(createDTOwithExitsFalse(VIPDTOResponse.class))") AttendanceDTOResponse toDto (Attendance source); } < /code> и работает как очарование без необходимости писать много дефолтов на каждом карте.Ambiguous factory methods found for creating ServicesDTOResponse: T createDto(K source, @TargetType Class dtoClass), T ToiletMapper.createDto(K source, @TargetType Class dtoClass). See https://mapstruct.org/faq/#ambiguous for more info.[/code], поскольку они оба расширяют GenericMapper. Что я могу сделать? Я бы хотел сделать это агенерным способом, так как есть 40 DTORSPONES. Может быть, есть более чистый способ разрешения существуют и дефолт каждого атрибута без использования выражений, я готов узнать, как это сделать!
У меня есть несколько класса DTORSPONSE, каждый из которых расширяет MinidTorSponse.
@Data
@NoArgsConstructor
public class MiniDTOResponse extends EmptyDTOResponse {
private boolean exists;
}
Я хотел бы понять, почему мой DateMapper не работает.@Mapper(componentModel = MappingConstants.ComponentModel.SPRING,
uses = {ProductMapper.class, TagMapper.class})
public interface DateMapper {
DateMapper INSTANCE =...
Я хотел бы понять, почему мой DateMapper не работает.@Mapper(componentModel = MappingConstants.ComponentModel.SPRING,
uses = {ProductMapper.class, TagMapper.class})
public interface DateMapper {
DateMapper INSTANCE =...
Я получаю massatchedInputexception от Jackson ObjectMapper. Как только я удаляю $ schema метаданные из JSON, исключение исчезает. Как я могу сохранить $ schema в JSON? ObjectMapper objectMapper = new ObjectMapper();
EnumMap mailingRequestCache =...
Я получаю massatchedInputexception от Jackson ObjectMapper. Как только я удаляю $ schema метаданные из JSON, исключение исчезает. Как я могу сохранить $ schema в JSON? ObjectMapper objectMapper = new ObjectMapper();
EnumMap mailingRequestCache =...