Lucas, isso acontece com requisições normais via URL. No caso eu tenho uma URI no endereço /admin/degree/, e se eu digitar /admin/degree/xx retorna NullPointerException.
Paulo, atualizei para o 3.1.1. Tenho alguns componentes customizáveis que nada mais é que o próprio RequestExecution, onde apenas troco a chamada do ExecuteMethodInterceptor para o CustomExecuteMethodInterceptor. O log do erro está abaixo. Não coloquei todo o debug porque não tinha informações muito úteis, mas se precisar posso enviar.
O que eu noto é que quando um resource não é encontrado o method vem NULL em todos os interceptors, então no caso do InstantiateInterceptor na linha 40 há um method.getResource, porém method é NULL.
Ambiente é vraptor 3.1.1, glassfishv3, projeto web + módulo EJB remoto.
WARNING: StandardWrapperValve[default]: PWC1406: Servlet.service() for servlet default threw exception
java.lang.NullPointerException
at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:40)
at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at esim.web.security.SecurityUserSessionHolder.intercept(SecurityUserSessionHolder.java:105)
at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at esim.web.interceptor.NoCacheInterceptor.intercept(NoCacheInterceptor.java:49)
at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at esim.web.interceptor.CustomRequestExecution.execute(CustomRequestExecution.java:43)
at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:47)
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
at br.com.caelum.vraptor.resource.DefaultResourceNotFoundHandler.couldntFind(DefaultResourceNotFoundHandler.java:41)
at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
at esim.web.interceptor.CustomRequestExecution.execute(CustomRequestExecution.java:43)
at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:332)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:233)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
at java.lang.Thread.run(Thread.java:619)
[code]@Component
@RequestScoped
public class CustomRequestExecution
implements RequestExecution {
private final InterceptorStack interceptorStack;
private final InstantiateInterceptor instantiator;
public CustomRequestExecution(InterceptorStack interceptorStack, InstantiateInterceptor instantiator) {
this.interceptorStack = interceptorStack;
this.instantiator = instantiator;
}
public void execute()
throws InterceptionException {
interceptorStack.add(MultipartInterceptor.class);
interceptorStack.add(ResourceLookupInterceptor.class);
interceptorStack.add(FlashInterceptor.class);
interceptorStack.add(InterceptorListPriorToExecutionExtractor.class);
interceptorStack.add(instantiator);
interceptorStack.add(ParametersInstantiatorInterceptor.class);
interceptorStack.add(DeserializingInterceptor.class);
interceptorStack.add(CustomExecuteMethodInterceptor.class);
interceptorStack.add(OutjectResult.class);
interceptorStack.add(DownloadInterceptor.class);
interceptorStack.add(ForwardToDefaultViewInterceptor.class);
interceptorStack.next(null, null);
}
}[/code]
[code]@Component
public class CustomExecuteMethodInterceptor
implements Interceptor {
private final CustomResult result;
private final MethodInfo info;
private final Validator validator;
private final Outjector outjector;
private CustomExecuteMethodInterceptor(CustomResult result, MethodInfo info, Validator validator,
Outjector outjector) {
this.result = result;
this.info = info;
this.validator = validator;
this.outjector = outjector;
}
public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance)
throws InterceptionException {
try {
Method reflectionMethod = method.getMethod();
Object[] parameters = this.info.getParameters();
Object result = reflectionMethod.invoke(resourceInstance, parameters);
if (validator.hasErrors()) { // method should have thrown ValidationError
throw new InterceptionException("There are validation errors and you forgot to specify where to go.");
}
if (!reflectionMethod.getReturnType().equals(Void.TYPE)) {
this.info.setResult(result);
}
stack.next(method, resourceInstance);
} catch (Exception e) {
if (result.getErrorMethod() == null) {
throw new RuntimeException(ExceptionUtils.getRootCause(e));
}
final String cause = ExceptionUtils.getRootCauseMessage(e);
final Message message = new ValidationMessage(cause, "error");
result.include("errors", Arrays.asList(message));
outjector.outjectRequestMap();
try {
final Method errorMethod = result.getErrorMethod();
final Object target = result.forwardTo(errorMethod.getDeclaringClass());
errorMethod.invoke(target, result.getErrorArgs());
} catch (Exception e0) {
throw new InterceptionException(e0);
}
}
}
public boolean accepts(ResourceMethod method) {
return true;
}
}
[/code]