Examen - Framework Spring and Architecture N-tiers

Page 1 sur 6Lecteur de document UniversityLib

Examen - Framework Spring and Architecture N-tiers

Software Architecture and Development · exam

Voir tous les documents en génie logiciel

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