EXAMEN
Semestre : 1
2 X
Session : Principale
X
Unité d’enseignement : Architecture N-tiers ………………………………………
Modules : Famework Spring - Architecture N-tiers .NET - Architecture Orientée Service « SOA »
Classe(s) : 4INFOB
Nombre de questions : 42 questions
Documents autorisés : OUI
NON
X
Nombre de pages : ..
Calculatrice autorisée : OUI
Date : …02/07/2020………………
NON
Heure
X
........
Internet autorisée : OUI
...10h45....... Durée :....1h30.....
NON X
Partie I : Framework Spring [14 questions]
[Spring Boot - Spring Core - Spring Data JPA - Spring MVC REST - Log4J -AOP – JSF]
Toutes les questions sont à réponse unique.
1 : On se propose de mettre en place une application de gestion
d’une auto-école.
Ci-dessous, le diagramme de classes.
- L’association bidirectionnelle Candidat-Examen
indique qu’un candidat peut passer plusieurs
examens et qu’un examen peut être passé par un seul
candidat à une date donnée.
- L’association
Candidat-
SeanceDeFormation indique qu’un candidat peut
assister à une ou plusieurs séances de formation.
bidirectionnelle
- L’énumération doit être stockée en tant que
chaîne de caractères dans la base.
D'après le diagramme de classes, quel est le nombre de
tables générées ? (/1pt)
- Les identifiants sont auto-générés avec la stratégie
«IDENTITY».
A. 3
B. 4
C. 5
D. 6
1/6
2 : Compléter QI.2. (/1pt)
@Entity
public class Candidat implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int idCd;
private String login;
private String pwd;
private int budgetFormations;
QI.2. ….
@O
List <Examen> examens;
neToMany(mappedBy="candidat")
}
A. @OneToMany(mappedBy="candidat")
B. @ManyToOne(mappedBy="candidat")
C. @OneToMany
D. @ManyToOne
3 : Compléter QI.3. (/1pt)
@Entity
public class Examen implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENT
ITY)
private int idEx;
Publicité
@Temporal(TemporalType.DATE)
private Date dateExamen;
@Enumerated(EnumType.STRING)
Type type;
@ManyToOne
QI.3. ….
Candidat candidat;
}
A. private List <Candidat> candidats;
B. private Candidat candidat;
C. a et b sont possibles
D. Aucune réponse
4 : Les services sont les suivants. Tous les services sont exposés avec Spring REST MVC.
Compléter QI.4. (/1pt)
public interface ICandidatService {
public void ajouterCandidat(Candidat candidat);
public void affecterExamenACandidat(int cdId, int exId);
public void affecterSeanceDeFormationACandidat(int cdId, int idex);
public List<SeanceDeFormation> listerFormations(int cdId);
public Candidat getCandidatByLoginAndPassword(String login, String password) ;
public void reussirExamen(int idex);
public List<Examen> listerExamens(int cdId);
public void desaffecterSeanceDeFormationACandidat(int idcd, int idsf);}
@RestController
public class RestControlCandidat {
@Autowired
ICandidatService icandidatservice;
@Autowired
IExamService iexamenservice;
@Autowired
ISeanceDeFormation iseanceformation;
// http://localhost:8083/affecterExamenACandidat/1/1
QI.4. ….
(value = "/affecterExamenACandidat/{idcdt}/{idex}")
@PutMapping
public void affecterExamenACandidat(@PathVariable("idcdt")int cdId,
@PathVariable("idex")int exId) {
icandidatservice.affecterExamenACandidat(cdId, exId);}}
2/6
A. @PostMapping
B. @PutMapping
C. @GetMapping
D. @DeleteMapping
5 : Service : Nous allons affecter une séance de formation, pour laquelle on a des places disponibles,
au candidat Ali selon le type de son examen et à une date antérieure à sa date d’examen. Après
affectation, nous allons mettre jour les places disponibles et le budget du candidat.
En premier lieu, nous avons besoin de chercher la formation correspondante. Compléter QI.5. (/1pt)
@Repository
public interface CandidatRepository extends CrudRepository<Candidat, Integer>
{
@Query("
public SeanceDeFormation getSeanceDeFormation(
Select sf from SeanceDeFormation sf where sf.type=:typeex and
@Param(
"typeex") Type
")
QI.5
typeex,
@Param
("d") Date d);
}
A. Select SeanceDeFormation sf where sf.type=:typeex and sf.dateSeance<:d and sf.nbPlaceLibre>0
B. Select sf from SeanceDeFormation sf where sf.type=:typeex or sf.dateSeance<:d or
sf.nbPlaceLibre>0
C. Select sf from SeanceDeFormation sf where sf.type=:typeex and sf.dateSeance<:d
and sf.nbPlaceLibre>0
D. Aucune réponse n’est correcte.
6 : Compléter QI.6. (/1pt)
@Repository
public interface CandidatRepository extends CrudRepository<Candidat, Integer>
{
@Query("
Select sf from SeanceDeFormation sf where sf.type=:typeex
Publicité
")
public SeanceDeFormation getSeanceDeFormation(
@Param
QI.6
("typeex") Type
typeex,
@Param
QI.6
("d") Date d);
}
A. @PathVariable
B. @Param
C. @QueryParam
D. @ParamQuery
3/6
7 : Authentification (login.xhtml): Le formulaire accepte un login
et un mot de passe, affiche un message d’erreur en cas d’une
éventuelle erreur d’identification et oriente l’utilisateur vers son
espace.
Espace Utilisateur (welcome.xhtml) : Après authentification,
l’utilisateur peut visualiser ses formations. Il peut aussi refuser une
formation. L’accès à cette page est sécurisé en utilisant un filtre
d’authentification.
Étant donné ce Controller, compléter QI.7. (/1pt)
@Scope(value = "session")
@ELBeanName(value = "candidatController")
@Join(path = "/", to = "/login.jsf")
@Controller
public class IControllerCandidatImpl {
@Autowired
ICandidatService icandidatservice;
private String login;
private String pwd;
private Candidat candidat;
private Boolean loggedIn;
public String dologin() {
String navigateTo = "null";
candidat=icandidatservice.getCandidatBy
LoginAndPassword(login, pwd);
if (candidat != null ) {
navigateTo = "/welcome.xhtml?faces-redirect=true";
loggedIn = true; } return navigateTo; } }
4/6
login.xhtml
<h:form id="form">
<b>Connexion</b>
<h:panelGrid columns="2">
<h:outputText value="Login" />
<h:inputText
value="#{ QI.7
candidatController
<h:outputText value="Mot de passe" />
<h:inputSecret
value="#{
<h:commandButton id="btn" value="Connexion"
.dologin}" />
action="#{ QI.7
<h:message for="btn"/>
</h:panelGrid>
</h:form>
candidatController
candidatController
.login}" />
.pwd}" />
QI.7
A. candidatController
B. iControllerCandidatImpl
C. IControllerCandidatImpl
D. Réponses b et c
8 : Voici une partie du code de welcome.xhtml.
Compléter QI.8. (/1pt)
<h:panelGroup>
<h:form>
Publicité
<h:outputText value="Bonjour #{
/>
<b>Bienvenue à ton espace.</b>
<b>Voici tes formations planifiées. </b>
<br />
<h:dataTable value="#{
candidatController
candidatCo
.
}"
listerFormations(1)}" var="sf">
<h:column>
<f:facet name="header">
<h:outputText value="Date" />
</f:facet>
<h:outputText value="#{
</h:column>
QI.8
sf.dateSeance
}"/>
……….
</h:dataTable>
candidatController
<h:commandLink value="Déconnexion" action=
"#{
</h:form>
</h:panelGroup>
.doLogout()}" />
A. Formation.dateSeance
B. sf.dateSeance
C. candidatController.dateSeance
D. Aucune réponse
9 : Nous avons ajouté un filtre d’authentification à notre application. Compléter QI.9. (/1pt)
public class LoginFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest hrequest= (HttpServletRequest)request;
HttpServletResponse hresponse= (HttpServletResponse)response;
IControllerCandidatImpl candidatcontroller=(IControllerCandidatImpl)
hrequest.getSession().getAttribute("candidatController");
if(candidatcontroller!=null && candidatcontroller.getLoggedIn())
chain.doFilter(request, response);
}
{
QI.9
else
{ hresponse.sendRedirect(hrequest.getContextPath()+"/");
}
}
}
A. Aucune réponse n’est correcte.
B. request.doFilter(request, response);
C. response.doFilter(request, response);
D. chain.doFilter(request, response);
10 : Nous avons ajouté à notre projet un aspect qui calcule et affiche dans les logs le temps d’exécution
de chaque méthode des services. Compléter QI.10 (/1pt).
@Component
@Aspect
public class PerformanceAspect {
private static final Logger logger =
LogManager.getLogger(PerformanceAspect.class);
@Aroun
QI.10
public Object profile(ProceedingJoinPoint pjp) throws Throwable {
("execution( tn.esprit.spring.services..*(..))")
long start = System.currentTimeMillis();
Object out=pjp.proceed();
long elapsedTime = System.currentTimeMillis() - start;
logger.info("Method execution time: " + elapsedTime + "
milliseconds.");
return out;
}}
A. @Before("execution( tn.esprit.spring.services..*(..))")
Publicité
5/6
B. @After("execution( tn.esprit.spring.services..*(..))")
C. @Around("execution( tn.esprit.spring.services..*(..))")
D. A et B
11 : Erreur1 : C'est quoi la cause de cette erreur ? Le
développeur a oublié de mettre (/1pt):
Caused by: org.hibernate.AnnotationException:
@OneToOne or @ManyToOne on
tn.esprit.spring.entities.Examen.candidat references an
unknown entity: tn.esprit.spring.entities.Candidat
A. @Id
B. @Entity
C. @OneToMany
D. @ManyToOne
12 : Erreur 2 : C’est quoi la cause la plus probable de cette
erreur ? (/1pt)
com.mysql.cj.jdbc.exceptions.CommunicationsException:
Communications link failure
The last packet sent successfully to the server was 0
milliseconds ago.
The driver has not received any packets from the server.
At com.mysql.cj.jdbc.exceptions.SQLError.
createCommunicationsException(SQLError.java:174)
~[mysql-connector-java-8.0.18.jar:8.0.18]
A. Le développeur a oublié de créer la base de données.
B. Le développeur a oublié d’annoter les entités par
l’annotation @Entity
C. Le développeur a mis un numéro de port erroné
pour l’accès au serveur de données
13 : Erreur 3 : C’est quoi la cause de cette erreur ? (/1pt)
Description:
Field icandidatservice in
tn.esprit.spring.controller.RestControlCandidat
required a bean of type
'tn.esprit.spring.services.ICandidatService'
that could not be found.
The injection point has the following
annotations:
@org.springframework.beans.factory.annotation.
Autowired(required=true)
A. Le développeur a oublié d’annoter
RestControlCandidat par l’annotation @RestController
la classe
B. Le développeur a
oublié d’annoter
l’objet ICandidatService icandidatservice ; par
l’annotation @Autowired
C. Le développeur a oublié d’annoter
CandidatServiceImpl par l’annotation @Service
D.
a et b
la classe
14 : Erreur 4 : C’est quoi la cause de cette erreur ? (/1pt)
javax.el.PropertyNotFoundException: Target Unreachable,
identifier [candidatControllerTest] resolved to null
at org.apache.el.parser.AstValue.getTarget
(AstValue.java:74) ~[tomcat-embed-el-9.0.27.jar:9.0.27]
at org.apache.el.parser.AstValue.getType
(AstValue.java:58) ~[tomcat-embed-el-9.0.27.jar:9.0.27]
at org.apache.el.ValueExpressionImpl.getType
(ValueExpressionImpl.java:174) ~[tomcat-embed-el-
9.0.27.jar:9.0.27]
A. Le développeur a oublié de vider le dossier Target
B. Le développeur a oublié de créer le dossier Target
D. Aucune réponse n’est correcte
C. Le développeur a mis un nom erroné de
son Controller
D. Aucune réponse n’est correcte.
6/6