Spring MVC控制器方法可以返回类似JSON对象(包含验证错误列表)而不是视图吗?

时间:2015-11-26 10:06:10

标签: spring jsp spring-mvc

我是Spring MVC的新手,我有以下问题。

我有一个JSP视图,用户可以在其中上传文件,这个视图是一个模态窗口(但它不是那么重要,它工作正常):

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

<!-- MODALE DI CONFERMA VALIDAZIONE PROGETTI -->
<div id="uploadFileRendicontoModal" class="modal fade">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
                <h3 class="modal-title" style="color: #3b5a76;">Inserimento documento di rendicontazione per il progetto <b><c:out value="${progetto.codMecIniPro}" />-<c:out value="${progetto.twp1010Tipoprogetto.desTipPrg}" /></b> </h3>

            </div>
            <div id="modal-body" class="modal-body">

                <div class="well">
                    <div class="row" style="margin-top: 5%;">

                        <div class="col-md-6">
                            <h4 style="margin-top: 2%; padding-left: 3%;">Allega rendiconto:</h4>
                        </div>

                        <div class="col-md-6" style="padding-right: 5%;">

                            <input id="rendicontoAllegato" class="form-control" style="height: 30px; padding: 0px;" type="file">

                            <!--  <input type="file" id="fileProspetto" type="text"    class="rightAlligned"   onchange="if ($('#fileProspetto').val()!=''){$('#inoltra').removeAttr('disabled');$('#inoltra').removeClass('button-disabled');} else{$('#inoltra').prop('disabled',true);$('#inoltra').addClass('button-disabled');}" ></input>-->

                        </div>

                    </div>

                    <div class="row" style="margin-top: 5%;">
                        <div class="col-md-6">
                            <h4 style="margin-top: 2%; padding-left: 3%;">Rendiconto allegato:</h4>
                        </div>

                        <div class="col-md-6">
                            <p id="fileName" style="font-size: 15px;"></p>
                        </div>

                    </div>
                </div>


            </div>

            <div class="modal-footer">
                <button id="chiudiAllegaRendicontoButton" type="button" class="btn btn-default"
                    data-dismiss="modal">Chiudi</button>
                <button id="confermaUploadRendicontoButton" type="button"
                    class="btn btn-primary" onclick="allegaRendiconto()" disabled>Allega</button>
            </div>
        </div>
        <!-- /.modal-content -->
    </div>
    <!-- /.modal-dialog -->
</div>
<!-- /.modal -->

<script type="text/javascript">
    $(document).ready(function() {
        //alert("DOCUMENT READY");

        $("#rendicontoAllegato").change(function() {
            $('#confermaUploadRendicontoButton').prop("disabled", false);   // Abilita il bottone per poter inviare il rendiconto

            var fileName = $("#rendicontoAllegato").val(); 
            $("#fileName").text(fileName);
        });
     });
</script>

因此,当用户点击 Allega 按钮(英文意为“附加”)时,会执行此 JavaScript 功能,该功能定义为只需检索的外部.js文件该文件已插入上一个视图输入标记,其中包含 type =“file” id =“rendicontoAllegato”并执行AJAX POST请求 inoltraRendiconto 资源将prvious文件发送到 SourceData JSON对象:

function allegaRendiconto()  {

    var fd = new FormData();

    fd.append('fileRendiconto',$('#rendicontoAllegato')[0].files[0]);

    $.ajax({
        type : "POST",
        url : "inoltraRendiconto",
        data: fd,
        processData: false,
        contentType: false
    }).done(function(principal) {
        document.open();
        document.write(principal);
        document.close();
    }).error(function(error) {
        showErrorMessage("errore");
    });;

}

此函数也正常工作,因此这是处理针对 inoltraRendiconto 资源的前一个POST请求的控制器方法:

@RequestMapping(value = "/inoltraRendiconto", method = RequestMethod.POST)
public String inoltraRendiconto( HttpServletRequest request, Model model, Locale locale ) throws Exception {

    System.out.println("INTO inoltraRendiconto");

    DefaultMultipartHttpServletRequest multipartRequest = (DefaultMultipartHttpServletRequest) request;

    List<String> errors = validaInputDocumentoAllegato(multipartRequest.getFileMap().get("fileRendiconto"));

    return "blabla";   // THIS IS NOT GOOD !!!
}

所以在这个方法中我首先检索附件(它工作正常)然后我把它传递给执行验证的 validaInputDocumentoAllegato()方法(该方法只是检查文件扩展名是否有效如果重量小于建立的最大尺寸)。此 validaInputDocumentoAllegato()方法返回表示验证错误的String列表(在这种情况下,类似“文件扩展名无效”和“文件权重太大”)。

我想将此错误列表返回到上一个视图以向其显示这些错误(如果用户尝试上传的文件无效,则不会上传,并且错误消息必须同时显示视图)。

正如您所看到的,这个contorller方法返回一个表示Spring MVC视图的String,但我不必这样做。

我是否可以返回包含必须在打开的视图中显示的验证错误列表的不同内容(可能是JSON对象?)?

TNX

所以

1 个答案:

答案 0 :(得分:2)

尝试添加@ResponseBody注释并返回错误列表:

@RequestMapping(value = "/inoltraRendiconto", method = RequestMethod.POST)
public @ResponseBody List<String> inoltraRendiconto( HttpServletRequest request, Model model, Locale locale ) throws Exception {

System.out.println("INTO inoltraRendiconto");

DefaultMultipartHttpServletRequest multipartRequest = (DefaultMultipartHttpServletRequest) request;

List<String> errors = validaInputDocumentoAllegato(multipartRequest.getFileMap().get("fileRendiconto"));

return errors;

}