Есть приложение, читающее файлы из файловой системы и загружающее в БД часть содержимого.
Есть сервисные классы, в них ряд методов, но возвращаемые типы в методах повторяются.
Хотелось бы сделать без спринг шелла, без команд в мейне.
@Entity
@Data
@Table(name = "users")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class User {
//...
@JsonBackReference
@ToString.Exclude
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "users_roles",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles;
}
@Entity
@Data
@EqualsAndHashCode(callSuper = false)
@Table(name = "roles")
public class Role implements GrantedAuthority {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long roleId;
@JsonBackReference
@ToString.Exclude
@ManyToMany(mappedBy = "roles")
private Collection<User> users;
@JsonBackReference
@ToString.Exclude
@ManyToMany
@JoinTable(
name = "roles_privileges",
joinColumns = @JoinColumn(name = "role_id"),
inverseJoinColumns = @JoinColumn(name = "privilege_id"))
private Collection<Privilege> privileges;
@Enumerated(EnumType.STRING)
private UserRole name;
public Role() {
super();
}
public Role(UserRole name) {
super();
this.name = name;
}
@Override
public String getAuthority() {
return name.name();
}
}
public enum UserRole {
USER,
ADMIN
}
@Entity
@Data
@EqualsAndHashCode(callSuper = false)
@Table(name = "privileges")
public class Privilege {
@Enumerated(EnumType.STRING)
private UserPrivilege name;
@JsonBackReference
@ToString.Exclude
@ManyToMany(mappedBy = "privileges")
private Collection<Role> roles;
}
public enum UserPrivilege {
ADMIN_PRIVILEGE,
READ_PRIVILEGE,
WRITING_COMMENTS_PRIVILEGE
}
Подскажите как лучше изучать spring, какой современный стек?
orElseThrow()
или возвращать другой объект (orElse()
) или новый объект и т.д.Optional<Vote> voteOptional = voteRepository.findById(voteId);
if(voteOptional.isEmpty()) {
throw new ApiException("Vote with id " + id +
"is not in DB");
}
Vote vote = voteRepository.findById(voteId).orElseThrow(VoteNotFoundException::new);
Но с другой стороны, если с фронта все правильно настроено, то таких ситуаций и не должно быть.
но я не знаю такие темы как Аннотации, Коллекции, Обобщения, Многопоточность и т. д.
Converter<S, T>
и т.д.).Стоит ли мне учить Spring и доучивать эти темы вместе или сначала учить эти темы потом перейти к Spring?
Разместить прямо в дто в каждом.
Converter<S, T>
), то для каждого entity нужно создать свой класс. Что касается расположения пакетов, то есть разные практики. Например, в пакет user закинуть User, UserCreationDto, UserRepository, UserService, UserToDtoConverter и т.д.@Service
@RequiredArgsConstructor
public class MapperService {
private final ModelMapper modelMapper;
/**
* Note: outClass object must have default constructor with no arguments
*
* @param <D> type of result object.
* @param <T> type of source object to map from.
* @param entity entity that needs to be mapped.
* @param outClass class of result object.
* @return new object of <code>outClass</code> type.
*/
public <D, T> D map(final T entity, Class<D> outClass) {
return modelMapper.map(entity, outClass);
}
/**
* Note: outClass object must have default constructor with no arguments
*
* @param entityList list of entities that needs to be mapped
* @param outCLass class of result list element
* @param <D> type of objects in result list
* @param <T> type of entity in <code>entityList</code>
* @return list of mapped object with <code><D></code> type.
*/
public <D, T> List<D> mapAll(final Collection<T> entityList, Class<D> outCLass) {
return entityList.stream().map(entity -> map(entity, outCLass)).collect(Collectors.toList());
}
/**
* Maps {@code source} to {@code destination}.
*
* @param source object to map from
* @param destination object to map to
*/
public <S, D> D map(final S source, D destination) {
modelMapper.map(source, destination);
return destination;
}
}
Создать отдельный класс DTOUtils и все туда скинуть ( но тогда там вперемешку будут методы конвертации всех классов )
Сделать пакет dtoutils и там создать много классов ( для каждого дто свой, они будут только хранить дто методы и все )
3 вариант выглядит как самый благоразумный, но создавать отдельный класс для одного метода это как-то не очень.
Converter<S, T>
@ControllerAdvice
или же обработать на уровне контроллера.@ExceptionHandler
Вопрос заключается в том, как обработать данное исключение, чтобы получить сообщение из исключения и поместить его во вьюшку?
/login
.antMatchers("/").permitAll()
.antMatchers("/login").permitAll()
/auth
.loginPage("/auth")
action="@{/auth}"
А отправлять запрос на указанный урл вам просто не разрешено и вы получите 403 permission denied..antMatchers("/auth").permitAll()
Converter<S, T>
для конвертации dto в entity This can be done in many ways. We will be discussing the following with examples.
GenericBeanDefinition
BeanDefinitionBuilder
BeanFactoryPostProcessor
BeanDefinitionRegistryPostProcessor
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
public class HibernateUtil {
final static StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
.configure()
.build();
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new MetadataSources(registry).buildMetadata()
.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static Session getSession()
throws HibernateException {
Session session = null;
try {
session = sessionFactory.getCurrentSession();
} catch (org.hibernate.HibernateException he) {
session = sessionFactory.openSession();
}
return session;
}
}
Session session = HibernateUtil.getSession();
session.beginTransaction();
note.setTitle("Example");
session.merge(note);
session.getTransaction().commit();
session.close();
как это сделать в Spring проекте где нету main`a
Но потом, когда я загружу проект на сервер, то там же другая файловая система, другие директории и т.д. - как с этим быть?
upload.path
будет /home/Desktop/uploads
, а для prod профиля будет uploads/
и т.д.Во-вторых - а как быть с безопасностью? Как-то же надо фильтровать то, что мне загружают? А то скрипт какой-нибудь загрузят или ещё что-то. Как это вообще отслеживать?
image/*
и т.д.Как отслеживать оставшееся место на диске?
нужно , чтобы в поле result попадал json как строка. Менять ответ контроллера (например обернуть в кавычки) я не могу.
имеет ли смысл только для работы с бд подключать springframework