首页 文章

提交 spring 形式时404错误

提问于
浏览
0

我在尝试在Spring中提交表单时遇到了一些问题 . 每次我尝试我都会收到404错误 . 这是我的控制器:

@Controller
@RequestMapping("/admin/news")
public class NewsController {

    @Autowired
    private NewsService newsService;

    @RequestMapping(value = "/create", method = RequestMethod.GET)
    public String createNews(Model model) {
        return "admin.news.create";
    }

    @RequestMapping(value = "/list", method = RequestMethod.GET)
    public ModelAndView listNews(Model model) {
        return listNews(1);
    }

    @RequestMapping(value = "/list/{pageIndex}", method = RequestMethod.GET)
    public ModelAndView listNewsPage(@PathVariable int pageIndex) {
        return listNews(pageIndex);
    }

    @RequestMapping(value = "/save", method = RequestMethod.POST)
    public String saveNews(@Valid NewsDto newsDto, BindingResult bindingResult, Model model) {
        if (!bindingResult.hasErrors()) {
            newsService.save(newsDto);
            model.addAttribute("created", true);
            model.addAttribute("news", newsDto);
        }

        return "admin.news.create";
    }

    private ModelAndView listNews(int pageIndex) {
        ModelAndView modelAndView = new ModelAndView("admin.news.list");

        Page page = newsService.findAll(pageIndex);
        modelAndView.addObject("page", page);

        return modelAndView;
    }

    @ModelAttribute("news")
    private NewsDto newsDtoModel() {
        return new NewsDto();
    }
}

这是表单(我正在使用Apache Tiles):

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="spring" %>

<div id="page-header">
    <h3>Create a news</h3>
</div>

<div id="page-content">
    <div class="panel">
        <div class="panel-heading">
            News creation form
        </div>

        <div class="panel-content">
            <spring:form method="post" commandName="news" action="save">
                <spring:input path="title" class="u-full-width" type="text" placeholder="Title of the news" required="true" />
                <spring:errors path="title" cssClass="validation-error" />

                <spring:textarea path="text" class="u-full-width" placeholder="News text" required="true" />
                <spring:errors path="text" cssClass="validation-error" />

                <input class="button-primary" type="submit" value="Submit" />
            </spring:form>
        </div>
    </div>
</div>

我已经阅读并尝试了我在SO中找到的与此错误相关的所有解决方案,但没有运气,我也在表单操作中尝试了所有可能的路由组合,但我总是得到404错误 . 这是 Headers :

GET / admin / news / save HTTP / 1.1主机:myserver:8080接受:text / html,application / xhtml xml,application / xml; q = 0.9,image / webp,/; q = 0.8 Accept-Encoding:gzip, deflate,sdch Accept-Language:en-US,en; q = 0.8,es; q = 0.6 Cookie:JSESSIONID = 2A3446E8A0A42C49B0ECF8EE2C38C917 DNT:1 Referer:myserver:8080 / admin User-Agent:Mozilla / 5.0(Windows NT 6.3; WOW64 )AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 39.0.2171.95 Safari / 537.36 HTTP / 1.1 404未找到缓存控制:无缓存,无存储,max-age = 0,必须重新验证内容 - 语言:en内容长度:1000内容类型:text / html; charset = UTF-8日期:星期五,2014年12月19日17:11:24 GMT到期:0 Pragma:no-cache服务器:Apache-Coyote / 1.1 X-Content-类型选项:nosniff X-Frame-Options:DENY X-XSS-Protection:1;模式=块

任何的想法?

EDIT 1: 我会在这里添加我的配置 .

ApplicationContext的:

@Configuration
@ComponentScan("com.davidmogar.alsa")
@PropertySource("classpath:application.properties")
@Import({WebMvcContext.class, PersistenceContext.class, SecurityContext.class})
public class ApplicationContext {

    private static final String MESSAGE_SOURCE_BASE_NAME = "i18n/messages";

    @Bean
    MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename(MESSAGE_SOURCE_BASE_NAME);
        messageSource.setUseCodeAsDefaultMessage(true);

        return messageSource;
    }

    @Bean
    PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

WebAppInitializer:

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    private static final String CHARACTER_ENCODING_FILTER_ENCODING = "UTF-8";

    private static final String DISPATCHER_SERVLET_MAPPING = "/";

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        WebApplicationContext context = super.createRootApplicationContext();
//        ConfigurableEnvironment env = (ConfigurableEnvironment) context.getEnvironment();
//        env.setActiveProfiles();
        return context;
}

@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class<?>[]{ApplicationContext.class};
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return null;
}

@Override
protected String[] getServletMappings() {
    return new String[]{DISPATCHER_SERVLET_MAPPING};
}

@Override
protected Filter[] getServletFilters() {
    DelegatingFilterProxy delegatingFilterProxy = new DelegatingFilterProxy();
    delegatingFilterProxy.setTargetBeanName("springSecurityFilterChain");

    CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
    characterEncodingFilter.setEncoding(CHARACTER_ENCODING_FILTER_ENCODING);
    characterEncodingFilter.setForceEncoding(true);
    OpenEntityManagerInViewFilter openEntityManagerInViewFilter = new OpenEntityManagerInViewFilter();
    HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();

    return new Filter[]{delegatingFilterProxy, characterEncodingFilter, openEntityManagerInViewFilter,
            hiddenHttpMethodFilter};
}

}

EDIT 2:

以下是URL的映射:

INFO - questMappingHandlerMapping - 映射“{[/ admin / news / save],methods = [POST],params = [],headers = [],consume = [],produce = [],custom = []}”on public java.lang.String com.davidmogar.alsa.web.admin.news.NewsController.saveNews(com.davidmogar.alsa.dto.news.NewsDto,org.springframework.validation.BindingResult,org.springframework.ui.Model)

2 回答

  • 1

    您的错误消息中的请求显示:

    GET / admin / news / save HTTP / 1.1主机:myserver:8080接受:

    它应该是一个POST,因为你只配置了你的controller / admin / news / save来处理POST

    @RequestMapping(value =“/ save”,method = RequestMethod.POST)

    您确定已列出正确的错误消息吗?您的jsp / html代码看起来是正确的,您如何提交表单?

  • 0

    原来这个问题是由配置错误引起的 . 我不得不重写应用程序初始化程序以使其工作,但我不确定是什么问题 . 这是新的初始化程序:

    public class WebAppInitializer implements WebApplicationInitializer {
    
        private static final String CHARACTER_ENCODING_FILTER_ENCODING = "UTF-8";
        private static final String CHARACTER_ENCODING_FILTER_NAME = "characterEncoding";
        private static final String CHARACTER_ENCODING_FILTER_URL_PATTERN = "/*";
    
        private static final String DISPATCHER_SERVLET_NAME = "dispatcher";
        private static final String DISPATCHER_SERVLET_MAPPING = "/";
    
        @Override
        public void onStartup(ServletContext servletContext) throws ServletException {
            AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
            rootContext.register(ApplicationContext.class);
    
            configureDispatcherServlet(servletContext, rootContext);
            EnumSet<DispatcherType> dispatcherTypes = EnumSet.of(DispatcherType.REQUEST,     DispatcherType.FORWARD);
            configureCharacterEncodingFilter(servletContext, dispatcherTypes);
            servletContext.addListener(new ContextLoaderListener(rootContext));
        }
    
        private void configureDispatcherServlet(ServletContext servletContext, WebApplicationContext rootContext) {
            ServletRegistration.Dynamic dispatcher = servletContext.addServlet(
                    DISPATCHER_SERVLET_NAME,
                    new DispatcherServlet(rootContext)
            );
            dispatcher.setLoadOnStartup(1);
            dispatcher.addMapping(DISPATCHER_SERVLET_MAPPING);
        }
    
        private void configureCharacterEncodingFilter(ServletContext servletContext, EnumSet<DispatcherType> dispatcherTypes) {
            CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
            characterEncodingFilter.setEncoding(CHARACTER_ENCODING_FILTER_ENCODING);
            characterEncodingFilter.setForceEncoding(true);
            FilterRegistration.Dynamic characterEncoding = servletContext.addFilter(CHARACTER_ENCODING_FILTER_NAME, characterEncodingFilter);
            characterEncoding.addMappingForUrlPatterns(dispatcherTypes, true, CHARACTER_ENCODING_FILTER_URL_PATTERN);
        }
    
    }
    

相关问题