У меня есть абстрактная базовая служба, включающая базовые операции CRUD. Однако может возникнуть ситуация, когда, например, при сохранении объекта «Сообщение» мне также необходимо сохранить информацию о пользователе, создавшем сообщение, поскольку сообщение и пользователь являются связанными объектами.
Тогда Я подумал, что было бы разумнее получить информацию о пользователе из 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);
}
Служба PostServiceImpl
public class PostServiceImpl extends BaseServiceImpl<
PostEntity,
PostResponseDTO,
PostRequestDTO,
PostMapper,
PostRepository>
implements PostService {
// Other codes...
}
Интерфейс почтового сервиса
public interface PostService extends BaseService
{
//Other codes...
}
Я придумал решение, но не уверен, логично ли оно и соответствует ли оно принципам SOLID. Есть ли у кого-нибудь лучшее решение?
UserContextService
@Service
@RequiredArgsConstructor
public class UserContextServiceImpl implements UserContextService {
private final UserRepository userRepository;
@Override
public UserEntity getCurrentAuthenticatedUser() {
String currentPrincipalEmail = SecurityContextHolder.getContext().getAuthentication().getName();
return userRepository.findByEmail(currentPrincipalEmail)
.orElseThrow(() -> new UsernameNotFoundException("User not found!"));
}
}
Составитель сообщений
@Mapper(componentModel = "spring", uses = {UserContextService.class, CategoryRepository.class})
public interface PostMapper extends IBaseMapper {
@Mapping(target = "author", expression = "java(userContextService.getCurrentAuthenticatedUser())")
PostEntity requestDTOToEntity(PostRequestDTO dto);
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... ile-adheri
Как я могу реализовать SecurityContextHolder в общей базовой службе, придерживаясь принципов SOLID? ⇐ JAVA
Программисты JAVA общаются здесь
1733561095
Anonymous
У меня есть абстрактная базовая служба, включающая базовые операции CRUD. Однако может возникнуть ситуация, когда, например, при сохранении объекта «Сообщение» мне также необходимо сохранить информацию о пользователе, создавшем сообщение, поскольку сообщение и пользователь являются связанными объектами.
Тогда Я подумал, что было бы разумнее получить информацию о пользователе из 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;
}
}}
[b]Интерфейс базового сервиса[/b]
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);
}
[b]Служба PostServiceImpl[/b]
public class PostServiceImpl extends BaseServiceImpl<
PostEntity,
PostResponseDTO,
PostRequestDTO,
PostMapper,
PostRepository>
implements PostService {
// Other codes...
}
[b]Интерфейс почтового сервиса[/b]
public interface PostService extends BaseService
{
//Other codes...
}
Я придумал решение, но не уверен, логично ли оно и соответствует ли оно принципам SOLID. Есть ли у кого-нибудь лучшее решение?
[b]UserContextService[/b]
@Service
@RequiredArgsConstructor
public class UserContextServiceImpl implements UserContextService {
private final UserRepository userRepository;
@Override
public UserEntity getCurrentAuthenticatedUser() {
String currentPrincipalEmail = SecurityContextHolder.getContext().getAuthentication().getName();
return userRepository.findByEmail(currentPrincipalEmail)
.orElseThrow(() -> new UsernameNotFoundException("User not found!"));
}
}
[b]Составитель сообщений[/b]
@Mapper(componentModel = "spring", uses = {UserContextService.class, CategoryRepository.class})
public interface PostMapper extends IBaseMapper {
@Mapping(target = "author", expression = "java(userContextService.getCurrentAuthenticatedUser())")
PostEntity requestDTOToEntity(PostRequestDTO dto);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79260262/how-can-i-implement-securitycontextholder-in-a-generic-base-service-while-adheri[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия