Olá pessoal, tudo bem?
seguinte: passei a ter problemas com um projeto que estava rodando muito bem, a partir do momento de resolvi utilizar lambdas nele… como mencionei no título, o projeto usa: VRaptor 4, Tomcat 8.0.9 e Java 8… o erro que dá é aquele mesmo de quando você tem o javassist desatualizado, por que ele não está preparado para ler as lambdas… demais códigos essencialmente Java 8 como a API de datas funcionam bem… o problema é realmente com lambdas… pois então, já tendo visto o erro do javassist e tendo pesquisado e resolvido o mesmo, fui direto nele… coloquei nas libs a ultima versão (javassist 3.18.2 GA) do mesmo… não resolveu!! mas reparando bem no stacktrace nota-se que o mesmo se refere ao paranamer:
25-Aug-2014 11:30:06.895 SEVERE [http-apr-8080-exec-7] org.apache.catalina.core.StandardContext.filterStart Exception starting filter vraptor
java.lang.ArrayIndexOutOfBoundsException: 22967
at com.thoughtworks.paranamer.BytecodeReadingParanamer$ClassReader.accept(BytecodeReadingParanamer.java:563)
at com.thoughtworks.paranamer.BytecodeReadingParanamer$ClassReader.access$200(BytecodeReadingParanamer.java:338)
at com.thoughtworks.paranamer.BytecodeReadingParanamer.lookupParameterNames(BytecodeReadingParanamer.java:103)
at com.thoughtworks.paranamer.AnnotationParanamer.lookupParameterNames(AnnotationParanamer.java:110)
at com.thoughtworks.paranamer.CachingParanamer.lookupParameterNames(CachingParanamer.java:90)
at com.thoughtworks.paranamer.CachingParanamer.lookupParameterNames(CachingParanamer.java:83)
at br.com.caelum.vraptor.http.ParanamerNameProvider.parametersFor(ParanamerNameProvider.java:50)
at br.com.caelum.vraptor.http.ParanamerNameProvider$Proxy$_$$_WeldClientProxy.parametersFor(Unknown Source)
at br.com.caelum.vraptor.http.route.DefaultTypeFinder.getParameterTypes(DefaultTypeFinder.java:55)
at br.com.caelum.vraptor.http.route.DefaultTypeFinder$Proxy$_$$_WeldClientProxy.getParameterTypes(Unknown Source)
at br.com.caelum.vraptor.http.route.DefaultRouteBuilder.addParametersInfo(DefaultRouteBuilder.java:196)
at br.com.caelum.vraptor.http.route.DefaultRouteBuilder.is(DefaultRouteBuilder.java:185)
at br.com.caelum.vraptor.http.route.PathAnnotationRoutesParser.registerRulesFor(PathAnnotationRoutesParser.java:118)
at br.com.caelum.vraptor.http.route.PathAnnotationRoutesParser.rulesFor(PathAnnotationRoutesParser.java:92)
at br.com.caelum.vraptor.http.route.PathAnnotationRoutesParser$Proxy$_$$_WeldClientProxy.rulesFor(Unknown Source)
at br.com.caelum.vraptor.ioc.ControllerHandler.handle(ControllerHandler.java:66)
baixei a versão mais nova 2.7 mas não resolveu… pesquisei mais um pouco, e acompanhando uma lista de discussão sobre isso (https://groups.google.com/forum/#!msg/caelum-vraptor/PjayRl-UJJU/frz-M-VuIt8J) alguém comentou para usar a seguinte abordagem, usando o parâmetro “-parameters” na compilação:
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Executable;
import javax.annotation.Priority;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Alternative;
import javax.interceptor.Interceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import br.com.caelum.vraptor.http.Parameter;
import br.com.caelum.vraptor.http.ParameterNameProvider;
@ApplicationScoped
@Alternative
@Priority(Interceptor.Priority.APPLICATION + 10)
public class JavaParameterNameProvider implements ParameterNameProvider {
private static final Logger logger = LoggerFactory.getLogger(JavaParameterNameProvider.class);
@Override
public Parameter[] parametersFor(AccessibleObject executable) {
logger.debug("looking for parameter names {}", executable);
java.lang.reflect.Parameter[] params = ((Executable) executable).getParameters();
Parameter[] out = new Parameter[params.length];
for (int i = 0; i < params.length; i++) {
if (!params[i].isNamePresent()) {
throw new IllegalStateException("No parameters found: " + executable);
}
out[i] = new Parameter(i, params[i].getName(), executable);
}
return out;
}
}
fiz o teste e a aplicação rodou, mas dava erro em qualquer link que clicava… verifiquei mais a fundo e os parâmetros estavam vindo com nomes do tipo: “arg0, arg1”… logicamente não iria funcionar, mas eu coloquei o parâmetro (-parameters) nas “Opções adicionais do Compilador” do Netbeans… comentando as lambdas tudo roda bem…
No site do paranamer diz que não é necessário usá-lo a não ser que se queira retro compatibilidade com Java 7 e Java 6…
alguém tem uma ideia do que possa ser e como resolver?
agradeço a atenção