【发布时间】:2017-01-12 07:41:08
【问题描述】:
我已经在基于 Spring Boot 的应用程序的一些 JSP 页面中集成了嵌入 UI 的 Vaadin 7,如 Vaadin Book 中所述。
尽管名为“v-my-vaadin-ui”的 UI 在我调用嵌入它的路径时正确显示(通过 Spring MVC 控制器),但在与 UI 交互时出现 HTTP 405 错误。
错误出现在 URL 上:
似乎是因为在 Spring Boot 中,所有控制器默认只允许使用 GET 方法(必须明确允许 POST,如 here 的解释)
已经尝试在我的 Spring 安全配置中禁用 CSRF 并配置 Vaadin 相关路径:
http.authorizeRequests()
.antMatchers("/vaadinServlet/**",
"/UIDL/**",
"/v-my-vaadin-ui/UIDL/**",
"/v-my-vaadin-ui/PUSH/**",
"/HEARTBEAT/**", "/VAADIN/**").permitAll();
http.csrf().disable();
因为 VAADIN 集成不需要 Spring 管理的 CSRF,但这并不能解决问题。
VAADIN 应用程序非常基础:
@SpringUI(path = "v-my-vaadin-ui")
public class MyVaadinUI extends UI {
private static final long serialVersionUID = -8129815147461786549L;
@Override
protected void init(VaadinRequest vaadinRequest) {
final TextField name = new TextField("Name");
final Button greetButton = new Button("Greet");
greetButton.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
Notification.show("Hi " + name.getValue(),
Notification.Type.HUMANIZED_MESSAGE);
}
});
VerticalLayout vl = new VerticalLayout(name, greetButton);
vl.setSpacing(true);
setContent(vl);
}
}
但是点击 Vaadin 按钮,响应码是 405,详细的异常是:
.wsmaResponseStatusExceptionResolver :从处理程序 [ResourceHttpRequestHandler [locations=[ServletContext 资源 [/]、类路径资源 [META-INF/resources/]、类路径资源 [resources/]、类路径资源 [static/] 解决异常, 类路径资源 [public/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@4a8756c3]]]: org.springframework.web.HttpRequestMethodNotSupportedException: 不支持请求方法'POST'
不幸的是,我没有找到 任何方法来为 UI 配置 POST 方法,因为对于简单的控制器,即通过
@RequestMapping(method = {RequestMethod.GET, RequestMethod.POST})
因为这个注解不能用于 Vaadin UI。
此外,如果我使用 URL 直接调用 UI(即不通过 Spring 控制器):
用户界面显示和工作完美。
知道是什么导致了这个问题吗?如何允许 POST 方法?
【问题讨论】:
-
您能否详细说明您用于嵌入 UI 的 URL 结构?或指向您正在关注的教程的链接?如果您的直接 UI 有效,那么嵌入失败的一种解释是与相关链接混淆。对 UI 本身的调用基本上什么都不做,只是返回嵌入 UI 的“全屏”的 html。
标签: spring spring-security spring-boot vaadin