gpt4 book ai didi

java - 在这种情况下,@InitBinder 和 WebDataBinder 的作用是什么

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:36:43 25 4
gpt4 key购买 nike

我对扩展抽象 Controller 的现有 Controller 做了一些更改

public abstract class AbstractWizardController {


private WizardDescriptor descriptor;


private transient String dispacherUri;


@InitBinder
public void initBinder(final WebDataBinder binder) {
final Locale locale = LocaleContextHolder.getLocale();
final DecimalFormatSymbols decimalSymbol = new DecimalFormatSymbols(locale);
if (Locale.FRENCH.equals(locale)) {
decimalSymbol.setDecimalSeparator(WebConstants.Caracteres.VIRGULE);
decimalSymbol.setGroupingSeparator(WebConstants.Caracteres.ESPACE);
} else {
decimalSymbol.setDecimalSeparator(WebConstants.Caracteres.POINT);
decimalSymbol.setGroupingSeparator(WebConstants.Caracteres.VIRGULE);
}
final DecimalFormat decimalFormat = new DecimalFormat(PseConstants.Pattern.MONTANT_PATTERN, decimalSymbol);
decimalFormat.setMinimumFractionDigits(NumbersEnum.DEUX.getNumber());
// Editeur personnalisé pour les montants
binder.registerCustomEditor(BigDecimal.class, new CustomNumberEditor(BigDecimal.class, decimalFormat, true));

// Editeur personnalisé pour les dates
final SimpleDateFormat formatDate = Locale.FRENCH.equals(locale) ? new SimpleDateFormat(WebConstants.DatesFormats.DATE_LOCAL_FRANCAIS)
: new SimpleDateFormat(WebConstants.DatesFormats.DATE_LOCAL_ANGLAIS);
formatDate.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(formatDate, true));
}
}

这是我的 Controller

@Controller
@RequestMapping(WebConstants.View.LETTRE_MANDAT)
public class EditerMandatController extends AbstractWizardController {

/** Logger */
private static final Logger LOGGER = LoggerFactory.getLogger(EditerMandatController.class);


private transient IEditerLettreService editerLettreService;

/**
* Constructeur
*/
public EditerMandatController() {
setDispacherUri(WebConstants.View.LETTRE_MANDAT);
}


@RequestMapping(value = WebConstants.View.EDITER_LETTRE_MANDAT, method = RequestMethod.POST)
public String editerLettreMandat(final HttpServletRequest req, final HttpServletResponse res,
@ModelAttribute(WebConstants.Path.FORM) final LettreMandatBean lettreMandat, final org.springframework.ui.Model model) throws AppTechnicalException {

final String idMandataire = WebUtilities.getIdMandataire(req);
lettreMandat.setIdMandataire(idMandataire);

final String lettreMandatCookie = JsonUtils.parseObjectJson(lettreMandat);

if (StringUtils.isNotBlank(lettreMandatCookie)) {
final Cookie cookie = new Cookie(WebConstants.Others.LETTRE_MANDAT_COOKIE + idMandataire, Base64.encodeBytes(lettreMandatCookie.getBytes()));
cookie.setSecure(true);
res.addCookie(cookie);
}
try {
editerLettreService.editerLettre(req, res, lettreMandat);

} catch (final AppTechnicalException e) {
LOGGER.error(WebConstants.Messages.MESSAGE_INCIDENT_TECHNIQUE, e);
addError(model, WebConstants.Messages.MESSAGE_INCIDENT_TECHNIQUE);
}
return WebConstants.View.PAGE_LETTRE_MANDAT;
}

}

我的问题是 @InitBinderWebDataBinder 在抽象 Controller 中的作用是什么?提前谢谢你

最佳答案

WebDataBinder 用于将表单字段填充到 bean 上。 init binder 方法初始化 WebDataBinder 并在其上注册特定的处理程序等。

当在服务器端读取表单字段时,最好是按照它们对应的类型来读取它们,而不是作为字符串来读取。例如,“2016 年 3 月 21 日”读作 Java 的 Date 类型比读作 String 更好。这可能涉及某些验证等。例如,像 03/21/2016 这样的日期在美国可能有效,但在其他一些国家则无效。因此,您可以使用 DataBinder 注册编辑器、 validator 等。请看:validators in InitBinderDataBinder doc

在这种情况下,@InitBinder 方法初始化 Binder 并注册上下文(区域设置)特定的处理程序、编辑器等。因此,当传入请求有日期时,它将在映射到 java bean 之前由 CustomDateEditor 处理。或者法国本地货币的处理方式与其他本地货币不同 - 小数点分隔符。

init binder 在抽象 Controller 中,因为这样其他 Controller 可以重用功能,而不必重写特定于语言环境的处理程序。

希望这对您有所帮助。

关于java - 在这种情况下,@InitBinder 和 WebDataBinder 的作用是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41035966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com