我正在将 Spring 4 与 Spring Data MongoDB 一起使用,并希望在我的控制器中摆脱一些样板代码。
我只想替换这个:
@RequestMapping("{id}")
void a(@PathVariable ObjectId id) {
DomainObject do = service.getDomainObjectById(id);
// ...
}
有了这个:
@RequestMapping("{id}")
void a(@PathVariable("id") DomainObject do) {
// ...
}
目前我必须为我拥有的每个域对象编写一对PropertyEditorSupport
和@ControllerAdvice
类:
@Component
public class SomeDomainObjectEditor extends PropertyEditorSupport {
@Autowired
SomeDomainObjectService someDomainObjectService;
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(someDomainObjectService.getById(new ObjectId(text)));
}
@Override
public String getAsText() {
SomeDomainObject value = (SomeDomainObject) getValue();
return (value != null ? value.getId().toString() : null);
}
}
@ControllerAdvice
public class SomeDomainObjectControllerAdvice {
@Autowired
SomeDomainObjectEditor someDomainObjectEditor;
@InitBinder
public void register(WebDataBinder binder, WebRequest request) {
binder.registerCustomEditor(SomeDomainObject.class, someDomainObjectEditor);
}
}
而且我想不出一种简单的方法来以通用的方式完成这项工作,因为我有很多域对象并且它们的行为都相同。
我所有的域对象都实现BaseDocument<ID>
并因此具有该getId()
方法。所以基本上我想要这样的东西:
public class BaseDocumentPropertyEditor extends PropertyEditorSupport { ... }
Converter<String, BaseDocument<?>>
使用它也可以在 Spring 框架中的其他地方使用它也可以(= 很好)让它工作。
我的主要问题是,我无法想象一种简单的方法来找到相应@Service
的以便从数据库中获取域对象。Repository
(由于某些数据的访问限制,我不能使用)。
希望你有一些建议。谢谢!