8

CardRequestResource を投稿するフォームを作成しようとしています:

public class CardRequestResource extends ResourceSupport{
    private Long cardRequestId;
    private String deliveryMethod;
    private String address;
    private boolean isHomeDelivery;
    private String requestDate;
    private String expectedDate;
    private String comments;
    private Long statusId;
    private PersonResource person;

    //Getters and Setters
}

私のコントローラーでは、まず JSP をロードし、空の CardRequestResource を ModelMap に追加します。

@RequestMapping(value = { "", "/approval" }, method = RequestMethod.GET)
public String getApproval(ModelMap map) {
    map.put("cardRequestResource", new CardRequestResource());       
    return "cardoffice/approval";
}

私の JSP は、cardRequestResource モデル属性を使用してフォームを作成します。

<form:form id="detailForm" name="detailForm" modelAttribute="cardRequestResource">
    <form:input path="statusId" type="hidden" id="statusId" name="statusId" />
    <form:textarea path="comments" name="comments" id="commentTextarea" rows="7" cols="81" style="font-style: normal;"/>
</form:form>

Javascript 関数が AJAX 呼び出しを行い、フォームの値を入力します。

function getCardRequestDetails(cardRequestUrl) {
    $.ajax({
        type : "GET",
        url : cardRequestUrl,
        dataType : "json",
        success : function(response) {
            loadCardRequestDetails(response);
        },
        error : function(response) {}
    });
};

function loadCardRequestDetails(cardRequest) {
    $("#statusId").attr("value", cardRequest.statusId);
    $("#commentTextarea").val(cardRequest.comments);
}

この時点で、ユーザーはコメント テキスト エリアを更新できます。非表示の入力は、ユーザーがフィールドに入力した内容に応じて条件付きで変更される場合があります。次に、フォームが送信されると、次の Javascript 関数を呼び出します。

function postCardRequest(url) {
    var serialized = $("#detailForm").serialize();
    alert(serialized);
    $.ajax({
        type: "POST",
        url: url,
        data: serialized,
        contentType: "application/json",
        dataType: "json"                
    });
}

このアラートは、AJAX/Javascript またはユーザーによって最初にロードされたデータがフィールドに正しく入力されていることを示しています。ただし、投稿を処理するコントローラーのハンドラーに到達すると、CardRequestResource は null ではありませんが、その中の EVERY SINGLE フィールドは NULL です!

ハンドラー コード:

@RequestMapping(value = "/approval/submit", method = RequestMethod.POST)
public @ResponseBody Map<String, Object> postCardRequest(@ModelAttribute(value = "cardRequestResource") CardRequestResource cardRequestResource) {
    Map<String, Object> responseMap = new HashMap<String, Object>();
    final String success = "success";
    Boolean isSuccessful = Boolean.FALSE;

    if(cardRequestResource != null){
        isSuccessful = Boolean.TRUE;
    }
    //TODO

    System.out.println("Status: " + cardRequestResource.getStatusId() + ", Comments: " + cardRequestResource.getComments());

    responseMap.put(success, isSuccessful);
    return responseMap;
}
4

2 に答える 2

11

だから私は犯人を見つけたと思います!

POST AJAX 呼び出しのこの小さな男:

contentType: "application/json",

私はもともと JSON をコントローラーに送信していましたが、Spring MVC には気の利いた ModelAttribute アノテーションがあることを知りました。そのため、POST 中に JSON との間で変換することを心配する必要はありません。残念ながら、その contentType 行を削除することは考えていませんでした。エラーが発生したり、まだそこに何かが含まれていると思われるかもしれません... どうやらそうではありません。バインディングの NULL 値と何時間もの無駄なデバッグ...

その行を削除した後、NULL ではなく CardRequest 属性でデータを取得し始めました。

于 2013-08-02T12:28:24.013 に答える
0

次のコードを aplication-context.xml に入れてみてください。フォームを持っている場合、これが解決策になる可能性がありますencType='multipart/form-data'

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10000000"/>
</bean>
于 2013-12-06T13:46:11.100 に答える