【问题标题】:How to receive LocalDate as parameter如何接收 LocalDate 作为参数
【发布时间】:2018-06-08 05:16:57
【问题描述】:

我正在尝试将一个简单对象插入数据库,但在我的控制器上我无法发送 LocalDate 参数。

错误显示malformed request syntax, invalid request message framing, or deceptive request routing,我很确定这是LocalDate 参数引起的。

我的控制器

@RequestMapping(value = "/finance",method = RequestMethod.POST)
    public String postFinance(@ModelAttribute("finance") 
        Finance finance, Model model){
       financeServices.targetActivate(finance);
       model.addAttribute("targetSetStatus",true);
        return "finance/finance";
}

财务实体

@Entity
public class Finance {


    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private LocalDate targetDate;
    private Double targetAmount;
    private LocalDate createdDate;

      //getter setters //

}

编辑:- 我正在尝试从表单插入,所以我的表单看起来像:-

<form class="form-horizontal" id="productForm" 
th:action="@{/finance}" method="post">

        <div class="form-group">
            <div th:if="${targetSetStatus}">
                <div class="alert alert-success">
                            <p>New Target Has Been Set</p>
                </div>
            </div>
        </div>

        <div class="form-group">
                <label class="control-label col-sm-3" 
                for="targetAmount">Target Amount:</label>
            <div class="col-sm-9">
                <input type="number" class="form-control"
                               placeholder="Targeted Amount" 
                               name="targetAmount" id="targetAmount">
        </div>
        </div>
        <div class="form-group">
            <label class="control-label col-sm-3" 
            for="targetDate">Target Date:</label>
            <div class="col-sm-9">
            <input type="date" class="form-control"
                               placeholder="Targeted Date"
                                name="targetDate" id="targetDate">
        </div>
        </div>
        <div class="form-group">
            <div class="col-sm-offset-3 col-sm-9">
                <button type="submit" class="btn btn-default">Set Target</button>
        </div>
    </div>
</form>

如果我用 java.util.Date 替换 LocalDate 它可以工作,但我想使用 LocalDate 它是 java 8 提供的 API。

【问题讨论】:

标签: java spring-mvc java-time localdate


【解决方案1】:

您必须注册一个自定义 JsonDeserializer。使用此代码:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import org.springframework.boot.jackson.JsonComponent;

import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

@JsonComponent
public class CustomJsonDeserializer {

    /*public static class Serializer extends JsonSerializer<LocalDate> {

        @Override
        public void serialize(LocalDate localDate, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {

        }
    }*/

    public static class LocalDateDeserializer extends JsonDeserializer<LocalDate> {

        @Override
        public LocalDate deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

            String strDate = jsonParser.getValueAsString();

            if (strDate == null || strDate.isEmpty()) {
                return null;
            }

            return LocalDate.parse(strDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        }
    }

}

看这个链接Custom JSON Serializers and Deserializers

【讨论】:

  • 我使用的是 spring mvc 而不是 spring boot。那么这仍然有效吗?我写了上面的类,导入了 Spring Boot 依赖项,但是没有用。
  • 这个链接可以帮到你link
猜你喜欢
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 2022-01-26
  • 2014-03-01
相关资源
最近更新 更多