Тогда Я подумал, что было бы разумнее получить информацию о пользователе из SecurityContextHolder и сохранить ее. Однако я не уверен, как применить это к методу сохранения в базовой службе для операций CRUD. В некоторых операциях по сохранению объектов мне не нужно иметь дело с информацией о пользователе, поэтому с ее сохранением проблем не возникает. Но для сохранения сообщения я хочу получить пользователя из SecurityContextHolder вместо того, чтобы получать его из requestDto.
Как я могу добиться этого, не нарушая базовую структуру, избегая повторения кода и придерживаясь принципам SOLID так, как это удобно для корпоративного проекта?
Код: Выделить всё
@RequiredArgsConstructor
public abstract class BaseServiceImpl<
Entity extends BaseEntity,
DTO extends BaseDTO,
RequestDTO,
Mapper extends IBaseMapper,
Repository extends BaseRepository>
implements BaseService {
private final Mapper getMapper;
private final Repository getRepository;
@Transactional
public DTO save(RequestDTO requestDTO) {
Entity entity = getMapper.requestDTOToEntity(requestDTO);
getRepository.save(entity);
return getMapper.entityToDTO(entity);
}
public List getAll() {
return getMapper.entityListToDTOList(getRepository.findAll());
}
public DTO update(UUID uuid, RequestDTO requestDTO) {
Entity entity = getRepository.findByUuid(uuid).orElse(null);
if (entity != null) {
entity = getMapper.requestDtoToExistEntity(entity, requestDTO);
getRepository.save(entity);
return getMapper.entityToDTO(entity);
} else {
return null;
}
}
public DTO getByUUID(UUID uuid) {
Entity entity = getRepository.findByUuid(uuid).orElse(null);
if (entity != null) {
return getMapper.entityToDTO(entity);
} else {
return null;
}
}
@Transactional
public Boolean deleteByUUID(UUID uuid) {
Entity entity = getRepository.findByUuid(uuid).orElse(null);
if (entity != null) {
getRepository.delete(entity);
return Boolean.TRUE;
} else {
return Boolean.FALSE;
}
}}
Код: Выделить всё
public interface BaseService<
DTO extends BaseDTO,
RequestDTO> {
DTO save(RequestDTO requestDTO);
List getAll();
DTO update(UUID uuid, RequestDTO requestDTO);
DTO getByUUID(UUID uuid);
Boolean deleteByUUID(UUID uuid);
}
Код: Выделить всё
public class PostServiceImpl extends BaseServiceImpl<
PostEntity,
PostResponseDTO,
PostRequestDTO,
PostMapper,
PostRepository>
implements PostService {
// Other codes...
}
Код: Выделить всё
public interface PostService extends BaseService
{
//Other codes...
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... ile-adheri