Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringMVCPUT方法我得到HTTP状态405,重定向到另一个内部视图失败_Java_Spring_Spring Mvc - Fatal编程技术网

Java SpringMVCPUT方法我得到HTTP状态405,重定向到另一个内部视图失败

Java SpringMVCPUT方法我得到HTTP状态405,重定向到另一个内部视图失败,java,spring,spring-mvc,Java,Spring,Spring Mvc,我正在使用SpringMVC来添加和更新表单。 不知道为什么在提交BindingResult(表单验证、错误输入等)时无法重定向回同一表单以显示错误消息。 使用PUT方法(更新内容)而不是POST方法(添加内容)时会发生这种情况。。。 请任何人建议我该怎么做。 提前谢谢 我收到的浏览器中有错误: HTTP Status 405 - HTTP method PUT is not supported by this URL type Status report messageHTTP method

我正在使用SpringMVC来添加和更新表单。 不知道为什么在提交BindingResult(表单验证、错误输入等)时无法重定向回同一表单以显示错误消息。 使用PUT方法(更新内容)而不是POST方法(添加内容)时会发生这种情况。。。 请任何人建议我该怎么做。 提前谢谢

我收到的浏览器中有错误:

HTTP Status 405 - HTTP method PUT is not supported by this URL
type Status report
messageHTTP method PUT is not supported by this URL  
descriptionThe specified HTTP method is not allowed for the requested resource.
GlassFish Server Open Source Edition 4.1.1
控制台没有显示任何内容。。。只是我做的日志,显示哪个输入字段出错

以下是控制器内部的方法:

//Add - no problem can show validation error message in the JSP form
@RequestMapping(value = "/userDetail", method = RequestMethod.POST)
public String saveUserDetail(@Valid UserDetail userDetail,
        Errors errors) {
    if (errors.getErrorCount() > 0) {
        log.info("User attempt create user: " + userDetail.toString());
        for (FieldError error : errors.getFieldErrors()) {
            log.info(error.getField() + ": " + error.getDefaultMessage());
        }
        //redirect to same page to show error return infor (NotEmpty etc...)
        return "/user/inputUserDetail"; //same structure for PUT method below, but not working show me 405 error
    } else {
        try {
            userDetailService.addUserDetail(userDetail);
        } catch (Exception e) {
            log.error("Failed to add new UserDetail: " + userDetail.toString());
        }
        return "redirect:/user/userDetails";
    }
}

//Update - need UserDetail model attribute
@RequestMapping(value = "/userDetail", method = RequestMethod.PUT)
public ModelAndView updateUserDetail(@Valid UserDetail userDetail,
        Errors errors, Map<String, Object> map) {
    if (errors.getErrorCount() > 0) {
        log.info("User attempt update user: " + userDetail.toString());
        for (FieldError error : errors.getFieldErrors()) {
            log.info(error.getField() + ": " + error.getDefaultMessage());
        }
        //I want to redirect to same form but show validation of previous inputted got error (NotEmpty, Email, typeMissMatch etc...)
        //Below tested all failed

        //Use this when return type is String
        //return "/user/inputUserDetail"; //405 error
        //return inputUserDetail(map); //405 error, direct call another method in same controller to show update form 
        //return "redirect:/user/userDetail/" + userDetail.getUdId(); //ok, but this one is redirect, no current errors bind to the update form

        //Use this when return type is ModelAndView
        map.put(BindingResult.MODEL_KEY_PREFIX + "userDetail", errors); 
        map.put("userDetail", userDetail);

        ModelAndView mv = new ModelAndView();
        mv.addObject(new RedirectView("FaddistWardrobe/user/userDetail"));
        mv.addAllObjects(map);
        return mv;
    } else {
        try {
            //update user detail
            userDetailService.updateUserDetail(userDetail);
        } catch (Exception e) {
            log.error("Failed to update UserDetail: " + userDetail.toString());
        }
        //This one okay can perform while form data correct
        //If return String like above method, result same, both ok
        return new ModelAndView("redirect:/user/userDetails");
    }
}
//添加-没有问题可以在JSP表单中显示验证错误消息
@RequestMapping(value=“/userDetail”,method=RequestMethod.POST)
公共字符串saveUserDetail(@Valid UserDetail UserDetail,
错误(错误){
if(errors.getErrorCount()>0){
log.info(“用户尝试创建用户:+userDetail.toString());
for(FieldError错误:errors.getFieldErrors()){
log.info(error.getField()+“:”+error.getDefaultMessage());
}
//重定向到同一页面以显示错误返回信息(NotEmpty等)
return“/user/inputUserDetail”;//与下面的PUT方法的结构相同,但不起作用show me 405错误
}否则{
试一试{
userDetailService.addUserDetail(userDetail);
}捕获(例外e){
log.error(“未能添加新的UserDetail:+UserDetail.toString());
}
返回“重定向:/user/userDetails”;
}
}
//更新-需要UserDetail模型属性
@RequestMapping(value=“/userDetail”,method=RequestMethod.PUT)
public ModelAndView updateUserDetail(@Valid UserDetail UserDetail,
错误(地图错误){
if(errors.getErrorCount()>0){
log.info(“用户尝试更新用户:+userDetail.toString());
for(FieldError错误:errors.getFieldErrors()){
log.info(error.getField()+“:”+error.getDefaultMessage());
}
//我想重定向到同一表单,但显示之前输入的got错误的验证(NotEmpty、Email、typeMissMatch等)
//以下测试全部失败
//当返回类型为字符串时使用此选项
//返回“/user/inputUserDetail”;//405错误
//返回inputUserDetail(map);//405错误,直接调用同一控制器中的另一个方法以显示更新表单
//return“redirect:/user/userDetail/”+userDetail.getUdId();//好,但这是redirect,没有当前错误绑定到更新表单
//当返回类型为ModelAndView时使用此选项
map.put(BindingResult.MODEL_KEY_PREFIX+“userDetail”,错误);
map.put(“userDetail”,userDetail);
ModelAndView mv=新ModelAndView();
mv.addObject(新的重定向视图(“faddistcoard/user/userDetail”);
mv.addAllObjects(地图);
返回mv;
}否则{
试一试{
//更新用户详细信息
updateUserDetail(userDetail);
}捕获(例外e){
log.error(“未能更新UserDetail:+UserDetail.toString());
}
//这个OK可以在表单数据正确时执行
//若返回字符串像上面的方法一样,结果相同,都可以
返回新的ModelAndView(“重定向:/user/userDetails”);
}
}
我为更新用户遵循RESTURL样式PUT方法的映射,不知道在使用PUT方法时是否可能无法调用内部JSP?或者任何我错过的PUT方法设置配置? 此webapp已配置org.springframework.web.filter.HiddenHttpMethodFilter

感谢并欢迎任何建议,我刚刚开始学习SpringMVC。。。
希望有人能帮忙。。。再次感谢。

问题是试图执行类似PUT=>Redirect=>PUT的操作

(1) 上面的代码在尝试添加正确数据时没有问题,因为它的执行方式类似于PUT=>Redirect=>GET

(2) 由于尝试使用PUT方法在同一页中显示错误而失败

解决方案是更改为PUT=>Redirect=>GET,编码如下:

//Update - need UserDetail model attribute
@RequestMapping(value = "/userDetail", method = RequestMethod.PUT)
public String updateUserDetail(@Valid UserDetail userDetail,
        Errors errors, Map<String, Object> map,
        final RedirectAttributes redirectAttributes) {
    if (errors.getErrorCount() > 0) {
        //log.info("User attempt update user: " + userDetail.toString());
        for (FieldError error : errors.getFieldErrors()) {
            log.info(error.getField() + ": " + error.getDefaultMessage());
        }
        //redirect to same page to show error return infor (NotEmpty etc...)
        redirectAttributes.addFlashAttribute("userDetail", userDetail);
        redirectAttributes.addFlashAttribute(BindingResult.MODEL_KEY_PREFIX + "userDetail", errors);
        return "redirect:/user/userDetail/error";
    } else {
        try {
            //update user detail
            userDetailService.updateUserDetail(userDetail);

        } catch (Exception e) {
            String tmp = e.getLocalizedMessage();
            String tmp2 = e.toString();
            //log.error("Failed to update UserDetail: " + userDetail.toString());
        }
        return "redirect:/user/userDetails";
    }
}


//Display form with validation error after update fail (PUT -> Redirect -> GET)
@RequestMapping(value = "/userDetail/error", method = RequestMethod.GET)
public String inputUserDetail_error() {
    //Here will auto retrieve previous redirectAttributes data and put into the JSP page.
    return "/user/inputUserDetail";
}
//更新-需要UserDetail模型属性
@RequestMapping(value=“/userDetail”,method=RequestMethod.PUT)
公共字符串updateUserDetail(@Valid UserDetail UserDetail,
错误,地图,
最终重定向属性(重定向属性){
if(errors.getErrorCount()>0){
//log.info(“用户尝试更新用户:+userDetail.toString());
for(FieldError错误:errors.getFieldErrors()){
log.info(error.getField()+“:”+error.getDefaultMessage());
}
//重定向到同一页面以显示错误返回信息(NotEmpty等)
redirectAttributes.addFlashAttribute(“userDetail”,userDetail);
redirectAttributes.addFlashAttribute(BindingResult.MODEL_KEY_PREFIX+“userDetail”,错误);
返回“重定向:/user/userDetail/error”;
}否则{
试一试{
//更新用户详细信息
updateUserDetail(userDetail);
}捕获(例外e){
字符串tmp=e.getLocalizedMessage();
字符串tmp2=e.toString();
//log.error(“未能更新UserDetail:+UserDetail.toString());
}
返回“重定向:/user/userDetails”;
}
}
//更新失败后显示有验证错误的表单(PUT->Redirect->GET)
@RequestMapping(value=“/userDetail/error”,method=RequestMethod.GET)
公共字符串inputUserDetail\u错误(){
//这里将自动检索以前的重定向属性数据并放入JSP页面。
返回“/用户/inputUserDetail”;
}
只需使用redirectAttributes存储临时模型,当用户重定向后,可以检索回以前的模型并使用它。 希望能用这个解决方案帮助其他刚加入SpringMVC的人。
谢谢

问题是试图执行类似PUT=>Redirect=>PUT的操作

(1) 上面的代码在尝试添加正确数据时没有问题,因为它的执行方式类似于PUT=>Redirect=>GET

(2) 由于尝试显示错误而失败