其实你的提的这个问题, 包含3个问题
1 java能否支持富血模型?
模型分2类, 贫血 or 富血.
贫血模型,就是一个对象里只有属性,如java中的pojo,不包含业务代码, 业务代码都写在service层. java中普遍使用的controller->service->dao->entity的分层方式, 就是这种贫血模型的实现. 贫血模型很貌似很经典, 但是写起来很啰嗦, 如果结合mybatis之类的, 多加几个mapper层, 实现就变得很复杂. 同时业务逻辑多起来后, service层的代码会爆炸.
富血模型, 就是属性和方法都封装在Domain Object里, 业务代码也写在里面. Service层功能很薄, 基本可以忽略. 而分层就会简化为controller->model, php的kohana跟ruby on rails都是这种模型. 富血模型很简单, 就2层, 容易把控, 复杂度不会爆炸, 但是逻辑可能会分散到各个model中, 不像贫血模型在service层统集中处理. 同时, 这种职责拆分, 很切合OOP模式, 利于维护. 一般配合ORM框架, 代码会很精简, 少就是好.
既然ruby/php等动态语言支持富血模型, 那么java可以支持吗? 当然可以, 语言不会限制你采用某类模型, 只是静态语言要考虑的实现细节会多很多
2 json做模型?
在js/php等弱类型语言中, 类型简单(如js的object, 如php的array), 功能强大, 操作灵活, 此等彪悍功能谁不想用. 但是强类型语言必须要兼顾各种类型, 像java你可以用map来模拟json, 但是你要操作map中的属性(如字符串操作/数值操作)时, 你就要进行明确的类型转换. 如果你只是简单的使用map来代替model, 那么类型转换的代码将充满你的屏幕, 等同于丢了西瓜捡了芝麻, 为了所谓的灵活, 引入了更大的复杂度.
当然, 用map来代替明确的属性定义是否可行? 当然可行, 只要你兼顾解决好类型转化就好.
3 在service层做校验? 用注解做?
其实每一层都需要进行数据校验, 但是如果你比较偷懒, 可以递延到底层(如dao/orm层). 只在service层做的话, 就会很啰嗦
校验用注解来做? 随便啊. 用代码做, 用表达式做都可以.
谁说java天生贫血, 我就做了一个富血的实现, 详见我的框架.