提交 0ba90615 编写于 作者: O Oliver Gondža

Present stacktrace when throwable attached to Descriptor.FormException

上级 38de41d1
......@@ -1144,7 +1144,7 @@ public abstract class Descriptor<T extends Describable<T>> implements Saveable {
.generateResponse(req, rsp, node);
} else {
// for now, we can't really use the field name that caused the problem.
new Failure(getMessage()).generateResponse(req,rsp,node);
new Failure(getMessage()).generateResponse(req,rsp,node,getCause());
}
}
}
......
......@@ -28,6 +28,7 @@ import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import javax.annotation.Nullable;
import javax.servlet.ServletException;
import java.io.IOException;
......@@ -54,6 +55,13 @@ public class Failure extends RuntimeException implements HttpResponse {
this.pre = pre;
}
public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node, @Nullable Throwable throwable) throws IOException, ServletException {
if (throwable != null) {
req.setAttribute("exception", throwable);
}
generateResponse(req, rsp, node);
}
public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) throws IOException, ServletException {
req.setAttribute("message",getMessage());
if(pre)
......
......@@ -24,6 +24,7 @@
package hudson.model;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import hudson.Launcher;
import hudson.model.Descriptor.PropertyType;
import hudson.tasks.BuildStepDescriptor;
......@@ -32,9 +33,14 @@ import hudson.tasks.Shell;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Callable;
import jenkins.model.Jenkins;
import net.sf.json.JSONObject;
import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.*;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
......@@ -42,6 +48,7 @@ import org.jvnet.hudson.test.Issue;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.TestExtension;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest;
@SuppressWarnings({"unchecked", "rawtypes"})
......@@ -195,4 +202,23 @@ public class DescriptorTest {
@TestExtension("nestedDescribableSharingClass") public static class DescriptorImpl extends Descriptor<Builder> {}
}
@Test
public void presentStacktraceFromFormException() throws Exception {
NullPointerException cause = new NullPointerException();
final Descriptor.FormException fe = new Descriptor.FormException("My Message", cause, "fake");
try {
rule.executeOnServer(new Callable<Void>() {
@Override public Void call() throws Exception {
fe.generateResponse(Stapler.getCurrentRequest(), Stapler.getCurrentResponse(), Jenkins.getInstance());
return null;
}
});
fail();
} catch (FailingHttpStatusCodeException ex) {
String response = ex.getResponse().getContentAsString();
assertThat(response, containsString(fe.getMessage()));
assertThat(response, containsString(cause.getClass().getCanonicalName()));
assertThat(response, containsString(getClass().getCanonicalName()));
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册