提交 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 { ...@@ -1144,7 +1144,7 @@ public abstract class Descriptor<T extends Describable<T>> implements Saveable {
.generateResponse(req, rsp, node); .generateResponse(req, rsp, node);
} else { } else {
// for now, we can't really use the field name that caused the problem. // 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; ...@@ -28,6 +28,7 @@ import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse;
import javax.annotation.Nullable;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import java.io.IOException; import java.io.IOException;
...@@ -54,6 +55,13 @@ public class Failure extends RuntimeException implements HttpResponse { ...@@ -54,6 +55,13 @@ public class Failure extends RuntimeException implements HttpResponse {
this.pre = pre; 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 { public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) throws IOException, ServletException {
req.setAttribute("message",getMessage()); req.setAttribute("message",getMessage());
if(pre) if(pre)
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
package hudson.model; package hudson.model;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import hudson.Launcher; import hudson.Launcher;
import hudson.model.Descriptor.PropertyType; import hudson.model.Descriptor.PropertyType;
import hudson.tasks.BuildStepDescriptor; import hudson.tasks.BuildStepDescriptor;
...@@ -32,9 +33,14 @@ import hudson.tasks.Shell; ...@@ -32,9 +33,14 @@ import hudson.tasks.Shell;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.concurrent.Callable;
import jenkins.model.Jenkins; import jenkins.model.Jenkins;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
...@@ -42,6 +48,7 @@ import org.jvnet.hudson.test.Issue; ...@@ -42,6 +48,7 @@ import org.jvnet.hudson.test.Issue;
import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.TestExtension; import org.jvnet.hudson.test.TestExtension;
import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
@SuppressWarnings({"unchecked", "rawtypes"}) @SuppressWarnings({"unchecked", "rawtypes"})
...@@ -195,4 +202,23 @@ public class DescriptorTest { ...@@ -195,4 +202,23 @@ public class DescriptorTest {
@TestExtension("nestedDescribableSharingClass") public static class DescriptorImpl extends Descriptor<Builder> {} @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.
先完成此消息的编辑!
想要评论请 注册