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

zaqlnxep  于 2022-11-14  发布在  Spring
关注(0)|答案(1)|浏览(107)

我对SpringMVC很陌生,我有以下问题。
我有一个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按钮时(英语中的意思是“Attach”)执行定义到外部.js文件中的该JavaScript函数,该函数仅检索插入到具有type=“file”id=“rendicontoAllegato”的前一视图input标记中的文件,并对inoltraRendiconto资源执行 AJAX POST请求,将前一文件发送到源数据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()**执行验证方法(该方法简单地检查文件扩展名是否有效以及权重是否小于所建立的最大大小)。()**方法返回表示验证错误的字符串列表(在本例中,类似于“File extension is not valid”和“The file weight is too big”)。
我想返回这个错误列表到以前的视图,以显示这些错误到它(如果用户试图上传的文件是无效的,它不上传,错误消息必须显示在同一个视图)。
正如您所看到的,这个控制器方法返回一个String,它表示一个SpringMVC视图,但我不必这样做。
我是否可以返回一些不同的内容(可能是JSON对象?),其中包含必须在打开的视图中显示的验证错误列表?

thtygnil

thtygnil1#

尝试添加@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;

}

相关问题