您的当前位置:首页正文

Spring Formatter API 实战指南

2024-12-01 来源:个人技术集锦

Spring Formatter API 实战指南

在Spring框架中,数据绑定是一个核心功能,它允许我们将HTTP请求参数自动映射到Controller层的方法参数上。Spring 3引入了Formatter API,进一步增强了这一功能,使得我们可以自定义数据格式化的方式。本文将通过一个具体实例,详细讲解如何使用Spring的Formatter API,特别是@NumberFormat@DateTimeFormat注解,来实现数据的自定义格式化。

预备知识

在深入代码之前,我们需要了解几个关键概念:

实战案例:Trade类的数据格式化

假设我们有一个Trade类,其中包含了金额和交易日期两个字段,我们需要对这两个字段进行特定的格式化。

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.NumberFormat;
import java.math.BigDecimal;
import java.util.Currency;
import java.util.Date;

public class Trade {
    private long tradeId;
    private String buySell;
    private Currency buyCurrency;
    private Currency sellCurrency;
    @NumberFormat(pattern = "#,###,###,###.##")
    private BigDecimal amount;
    @DateTimeFormat(pattern = "MM-dd-yyyy")
    private Date tradeDate;
    //getters and setters
}

在这个类中,amount字段使用了@NumberFormat注解,定义了数字的显示格式,而tradeDate字段使用了@DateTimeFormat注解,定义了日期的显示格式。

Controller层的数据绑定

在Controller层,我们需要注册这些Formatter,以便Spring能够在数据绑定时使用它们。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.format.number.CurrencyStyleFormatter;
import org.springframework.format.number.NumberStyleFormatter;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("trades")
public class TradeController {
    @Autowired
    private TradeService tradeService;

    @InitBinder
    private void customizeBinding(@PathVariable("tradeId") long tradeId, WebDataBinder binder) {
        Trade trade = tradeService.getTradeById(tradeId);
        if (trade == null) {
            return;
        }
        DateFormatter dateFormatter = new DateFormatter();
        dateFormatter.setPattern("MM-dd-yyyy");
        binder.addCustomFormatter(dateFormatter, "tradeDate");
        NumberStyleFormatter numberFormatter = new NumberStyleFormatter();
        numberFormatter.setPattern("#,###,###,###.##");
        binder.addCustomFormatter(numberFormatter, "amount");
        CurrencyStyleFormatter currencyFormatter = new CurrencyStyleFormatter();
        currencyFormatter.setCurrency("Buy".equals(trade.getBuySell()) ? trade.getBuyCurrency() : trade.getSellCurrency());
        binder.addCustomFormatter(currencyFormatter, "amount");
    }

    @RequestMapping("/{tradeId:\\d+}")
    public String handleTradeRequest(@PathVariable("tradeId") long tradeId, Model model) {
        Trade trade = tradeService.getTradeById(tradeId);
        if (trade == null) {
            model.addAttribute("msg", "No trade found");
            return "no-trade-page";
        }
        model.addAttribute("trade", trade);
        return "trade-page";
    }
}

在这个Controller中,我们通过@InitBinder方法注册了DateFormatterNumberStyleFormatter,用于格式化tradeDateamount字段。对于货币字段,我们使用了CurrencyStyleFormatter

测试与运行

为了测试我们的Controller,我们可以运行单元测试或使用嵌入式Tomcat运行应用:

mvn clean install tomcat7:run-war

技术栈

  • Spring Web MVC 4.2.4.RELEASE
  • Spring TestContext Framework 4.2.4.RELEASE
  • Java Servlet API 3.0.1
  • JUnit 4.12
  • JDK 1.8
  • Maven 3.0.4

通过本文的实战指南,你应该能够理解如何在Spring应用中使用Formatter API来实现数据的自定义格式化。这不仅能够提升应用的用户体验,还能确保数据的正确性和一致性。

显示全文