1

使用 Spring 3.2.3,我正在尝试实现一个简单的 CRUD 控制器来处理 REST-ful URL。它依靠 PropertyEditor 通过从应用程序服务加载路径变量将其转换为 BusinessService 实体。代码如下:

@Controller
public class BusinessServiceController {
    @Autowired
    private BusinessServiceService businessSvcService;

    public BusinessServiceController() {
    }

    @InitBinder
    public void initBinder(final WebDataBinder binder) {
        binder.registerCustomEditor(BusinessService.class, new BusinessServicePropertyEditor(businessSvcService));
    }

    @RequestMapping(value = "/ui/account/business-services/{businessSvc}", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public ModelAndView update(@ModelAttribute("businessSvc") @Valid final BusinessService businessSvc, final BindingResult result,
            final RedirectAttributes redirectAttribs) throws UnknownBusinessServiceException {
        ModelAndView mav;

        if (result.hasErrors()) {
            mav = new ModelAndView("/business-service/edit");
        }
        else {
            businessSvcService.updateBusinessService(XSecurity.principal().getId(), businessSvc);

            mav = new ModelAndView("redirect:/ui/account/business-services");
            redirectAttribs.addFlashAttribute("message", Message.info("businessService.updated", businessSvc.getTitle()));
        }

        return mav;
    }
}

public class BusinessServicePropertyEditor extends PropertyEditorSupport {
    private final BusinessServiceService businessSvcService;

    public BusinessServicePropertyEditor(final BusinessServiceService businessSvcService) {
        this.businessSvcService = businessSvcService;
    }

    @Override
    public String getAsText() {
        final BusinessService svc = (BusinessService) getValue();
        return Long.toString(svc.getId());
    }

    @Override
    public void setAsText(final String text) {
        final BusinessService svc = businessSvcService.getBusinessService(Long.parseLong(text));
        setValue(svc);
    }
}

根据SPR-7608,从 Spring 3.2 开始,@ModelAttribute 方法参数解析检查是否存在同名的路径变量(它在这里),在这种情况下,它尝试通过注册将该路径变量的值转换为目标参数类型转换器和属性编辑器。这不是我正在经历的。当我检查 ServletModelAttributeMethodProcessor 做了什么时,它清楚地使用请求 DataBinder 的 ConversionService 来执行类型转换,这不考虑注册的 PropertyEditor,因此永远不会调用 BusinessServicePropertyEditor#setAsText。

这是配置问题还是实际错误?

谢谢你的帮助!

4

1 回答 1

1

SpringConversionServiceConverters 是标准 Java Beans 的替代品PropertyEditor

如果此功能纯粹基于转换服务,您需要实现Converter而不是。PropertyEditor


要注册您的自定义转换器,WebDataBinder您可以使用ConfigurableWebBindingInitializeror@InitBinder方法。

于 2013-06-16T08:53:23.940 回答