⇒ Transactions multiparties complexes

UserTransaction (EJB), EntityTransaction (JPA)setRollbackOnly@TransactionAttribute:
MANDATORY, REQUIRED, REQUIRES_NEW, …@Transactional

@Entity
public class Couleur {
@Id
@GeneratedValue
private Long id;
private String nom;
private String description;
private String colorCode;
// ... accesseurs, constructeurs, equals, etc
}
public interface CouleurRepository
extends CrudRepository<Couleur, Long> {
}
définit save, findById, findAll, count, delete, existsById, etc
(c.f. code de CrudRepository)
@Autowired
private CouleurRepository couleurRepository;
@Test
void testCouleurRepository() {
Couleur c = new Couleur("vert","basique","00FF00");
couleurRepository.save(c);
Optional<Couleur> c2 = couleurRepository.findById(c.getId());
assertTrue(c2.isPresent());
assertEquals(c,c2.get());
}
LOG.info("Classe d'implementation de CouleurRepository: {}",
couleurRepository.getClass());
donne
Classe d'implementation de CouleurRepository:
class com.sun.proxy.$Proxy95
public interface CouleurRepository extends CrudRepository<Couleur, Long> {
Optional<Couleur> findByNom(String nom);
}
@Test
void testMethodeGenereeParNom() {
Couleur c = new Couleur("bleu","basique","00FF00");
couleurRepository.save(c);
Optional<Couleur> c2 = couleurRepository.findByNom(c.getNom());
assertTrue(c2.isPresent());
assertEquals(c,c2.get());
}
find | By | Nom | And | ColorCodeSELECT cFROM Couleur cWHERE c.nom = :nomAND c.colorCode = :colorCodePour les cas complexes: spécifier une requête JPQL
public interface CouleurRepository
extends JpaRepository<Couleur, Long> { //!\\
@Query("select c from Couleur c where c.colorCode = ?1")
Optional<Couleur> getByColorCode(String colorCode);
}
SecurityContextHolderAuthentication permettant de récupérer
le principal contient des informations sur l’utilisateur
UserDetailsUserDetailsServiceAuthenticationServletFilterAuthenticationManager
ServletFilters AccessDecisionManagerdecide(authentication, targetObject, configAttributes)AccessDeniedException, InsufficientAuthenticationExceptionSecurityInterceptorutilise des AccessDecisionVoters
(avec une méthode vote similaire à decide)

Source Spring
Activation via @EnableWebSecurity
Classes qui étendent WebSecurityConfigurerAdapter