Olá
acabei q não utilizei a versão mais nova pq mudou muita coisa, inclusive o plugin com o spring… e não tem tempo habil para migar a aplicação inteira… acabei usando a versão 2.0.11 mesmo sem annotation nos action… usando o struts.xml mesmo… ai funcionou certinho…
mas estou com outro problema relacionado a validação… com annotations d novo…
olhe meu codigo
@Validation
public class SsiAction extends GenericStrutsAction {
.................
private List<Employee> employees;
private List<RqType> rqTypes;
private List<Application> applications;
private List<Status> status;
private List<Ssi> ssis;
private List<DocumentGroup> groups;
...............
public String execute(){
populateSsiForm();
return GenericStrutsAction.SUCCESS;
}
public String list(){
ssis = ssiRepository.findAll();
Collections.sort(ssis,Ssi.CODE_COMPARATOR);
return GenericStrutsAction.LIST;
}
.....................
public String edit(){
ssi = ssiRepository.save(getSsi());
ProgressReport progressReport = progressReportRepository.findBySsi(ssi);
if (progressReport == null) {
progressReport = new ProgressReport();
progressReport.setDate(ssi.getCreation());
progressReport.setSsi(ssi);
progressReportRepository.save(progressReport);
}
return SsiAction.SHOW_SSI;
}
....................
........... << GETS >> ...........
@SkipValidation
public void setGroups(List<DocumentGroup> groups) {
this.groups = groups;
}
@SkipValidation
public void setApplicationRepository(
ApplicationRepository applicationRepository) {
this.applicationRepository = applicationRepository;
}
@SkipValidation
public void setEmployeeRepository(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
@SkipValidation
public void setProgressReportRepository(
ProgressReportRepository progressReportRepository) {
this.progressReportRepository = progressReportRepository;
}
@SkipValidation
public void setRqTypeRepository(RqTypeRepository rqTypeRepository) {
this.rqTypeRepository = rqTypeRepository;
}
@SkipValidation
public void setSsiRepository(SsiRepository ssiRepository) {
this.ssiRepository = ssiRepository;
}
@SkipValidation
public void setStatusRepository(StatusRepository statusRepository) {
this.statusRepository = statusRepository;
}
@SkipValidation
public void setDocumentGroupService(
DocumentGroupService documentGroupService) {
this.documentGroupService = documentGroupService;
}
@SkipValidation
public void setSsiService(SsiService ssiService) {
this.ssiService = ssiService;
}
@RequiredStringValidator(message = "Please enter a name")
public void setTeste(String teste) {
this.teste = teste;
}
}
estou qrendo validar apenas o campo teste… olhe a jsp agora
<%@ page contentType="text/html; charset=iso-8859-1" pageEncoding="LATIN1" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
..............
</head>
<body>
<jsp:include page="/includes/header.jsp" />
<s:form action="ssi!edit.action" id="fromEdit" validate="true">
<table width="99%" border="1" class="tablemain" cellpadding="0"
cellspacing="0" align="center">
<tr>
<td height="30" colspan="8" class="tdTitle">Ordem de Serviço</td>
</tr>
<tr>
<td>
<table width="100%" border="0" cellpadding="3" cellspacing="1" align="center">
<tr>
<td colspan="8">
<s:actionerror />
<s:fielderror />
</td>
<tr>
<tr>
<td width="9%" height="40">Número da OS:</td>
<td width="20%"><s:textfield id="ssi.code" name="ssi.code" value="%{ssi.code}" theme="simple"/></td>
<td width="10%">Nome do Projeto:</td>
<td width="35%" colspan="3"><s:textarea id="ssi.title" name="ssi.title" value="%{ssi.title}" theme="simple" cols="34" rows="2"/></td>
<td width="10%">Data de Abertura:</td>
<td>
<input type="text"
name="ssi.creation"
size="9"
value="<s:date name='ssi.creation' format='dd/MM/yyyy'/>"
id="ssi.creation">
<a href="#"><img src="<s:url value='/images/iconecalendario.gif' />" border="0" id="button.creation" /></a>
</td>
</tr>
<tr>
<td>Descrição:</td>
<td width="40%" colspan="5">
<s:textarea value="%{ssi.comment}" id="ssi.comment" name="ssi.comment" theme="simple" cols="64" rows="2" />
<br>
teste: <s:textfield value="%{teste}" id="teste" name="teste" theme="simple"/>
<br>
</td>
<td>Data de Início:</td>
<td>
<input type="text"
name="ssi.start"
size="9"
value="<s:date name='ssi.start' format='dd/MM/yyyy'/>"
id="ssi.start">
<a href="#"><img src="<s:url value='/images/iconecalendario.gif' />" border="0" id="button.start" /></a>
</td>
</tr>
<tr>
<td>Sigla:</td>
<td>
<s:select
name="ssi.application.id"
theme="simple"
list="applications"
listKey="id"
listValue="description"
id="ssi.application.id"
value="%{ssi.application.id}"
/>
</td>
<td>Responsável Consórcio:</td>
<td colspan="5">
<s:select
theme="simple"
list="employees"
listKey="id"
listValue="name"
id="ssi.analystResp.id"
name="ssi.analystResp.id"
value="%{ssi.analystResp.id}"/>
</td>
</tr>
<tr>
<td>Esforço Estimado:</td>
<td><s:textfield size="5" id="ssi.estimatedEffort" name="ssi.estimatedEffort" value="%{ssi.estimatedEffort}" theme="simple"/> </td>
<td>Responsável SI:</td>
<td colspan="3"><s:textfield id="ssi.customerResp" name="ssi.customerResp" value="%{ssi.customerResp}" theme="simple" size="41" /></td>
<td>Data Prevista de Término:</td>
<td>
<input type="text"
name="ssi.finish"
size="9"
value="<s:date name='ssi.finish' format='dd/MM/yyyy'/>"
id="ssi.finish">
<a href="#"><img src="<s:url value='/images/iconecalendario.gif' />" border="0" id="button.finish" /></a>
</td>
</tr>
<tr>
<td>Unidade de Medida:</td>
<td>
<s:select
theme="simple"
list="rqTypes"
name="ssi.rqType1.id"
listKey="id"
listValue="description"
id="ssi.rqType1.id"
value="%{ssi.rqType1.id}"
/>
</td>
<td>Situação Atual:</td>
<td colspan="3">
<s:select
theme="simple"
list="status"
name="ssi.status.id"
listKey="id"
listValue="description"
id="ssi.status.id"
value="%{ssi.status.id}"
/>
</td>
<td>Data Última Atualização:</td>
<td>
<input type="text"
name="ssi.statusDate"
size="9"
value="<s:date name='ssi.statusDate' format='dd/MM/yyyy'/>"
id="ssi.statusDate">
<a href="#"><img src="<s:url value='/images/iconecalendario.gif' />" border="0" id="button.statusDate" /></a>
<script type="text/javascript">
Calendar.setup({
inputField : "ssi.creation",
ifFormat : "%d/%m/%Y",
button : "button.creation"
});
Calendar.setup({
inputField : "ssi.start",
ifFormat : "%d/%m/%Y",
button : "button.start"
});
Calendar.setup({
inputField : "ssi.finish",
ifFormat : "%d/%m/%Y",
button : "button.finish"
});
Calendar.setup({
inputField : "ssi.statusDate",
ifFormat : "%d/%m/%Y",
button : "button.statusDate"
});
</script>
</td>
</tr>
<tr>
<td colspan="8"> </td>
</tr>
<tr>
<td colspan="8" align="right">
<s:hidden name="ssi.id" id="ssi.id" value="%{ssi.id}"></s:hidden>
<span onclick="javascript:document.forms[0].submit();" style="cursor: pointer;">
<img src='<s:url value="/images/btgravar.gif" />' border="0"/>
</span >
<span onclick="javascript:parent.location.replace('index.jsp');" style="cursor: pointer;">
<img src='<s:url value="/images/btcancelar.gif" />' border="0"/>
</span >
</td>
</tr>
</table>
</td>
</tr>
</table>
</s:form>
</body>
</html>
e meu struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.objectFactory" value="spring" />
<constant name="struts.devMode" value="true" />
<constant name="struts.locale" value="en_GB" />
<constant name="struts.i18n.encoding" value="LATIN1" />
<package name="dashboard" namespace="/" extends="struts-default">
<action name="ssi!*" method="{1}" class="MyAction">
<result name="input">/nav/ssi/edit.jsp</result>
<result name="error">/nav/ssi/edit.jsp</result>
<result name="edit">/nav/ssi/edit.jsp</result>
<result name="list">/nav/ssi/list.jsp</result>
<result name="listssi" type="redirect-action">
<param name="actionName">ssi!list</param>
<param name="namespace">/</param>
</result>
<result name="show">/nav/ssi/show.jsp</result>
<result name="showssi" type="redirect-action">
<param name="actionName">ssi!show</param>
<param name="namespace">/</param>
<param name="ssi.id">${ssi.id}</param>
</result>
<result name="success">/nav/ssi/edit.jsp</result>
<result name="tree">/nav/ssi/tree.jsp</result>
</action>
</package>
</struts>
mesmo eu chamando por “ssi!list.action” ele ja da o seguinte exception
12:31:14,078 ERROR [[jsp]] Servlet.service() for servlet jsp threw exception
tag 'select', field 'list', id 'ssi.application.id', name 'ssi.application.id': The requested list key 'applications' could not be resolved as a
collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location]
at org.apache.struts2.components.Component.fieldError(Component.java:231)
at org.apache.struts2.components.Component.findValue(Component.java:293)
at org.apache.struts2.components.ListUIBean.evaluateExtraParams(ListUIBean.java:79)
at org.apache.struts2.components.Select.evaluateExtraParams(Select.java:99)
at org.apache.struts2.components.UIBean.evaluateParams(UIBean.java:780)
at org.apache.struts2.components.UIBean.end(UIBean.java:481)
at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:43)
at org.apache.jsp.nav.ssi.edit_jsp._jspx_meth_s_select_0(org.apache.jsp.nav.ssi.edit_jsp:660)
at org.apache.jsp.nav.ssi.edit_jsp._jspx_meth_s_form_0(org.apache.jsp.nav.ssi.edit_jsp:336)
at org.apache.jsp.nav.ssi.edit_jsp._jspService(org.apache.jsp.nav.ssi.edit_jsp:122)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
at org.apache.struts2.dispatcher.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:139)
at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:178)
at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:348)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:253)
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:123)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:186)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:105)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:83)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:207)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:74)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:127)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:107)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:206)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:115)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:143)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:121)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:170)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:123)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:504)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:81)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrincipalValve.java:39)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:159)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:59)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
at java.lang.Thread.run(Unknown Source)
se eu retirar apenas o @RequiredStringValidator(message = “Please enter a name”) da minha action, ele rederia a pagina sem maiores problemas…
alguem poderia me ajudar?
Att.,
Kleber Pinel Bernardo da Silva