jfinal让我使用起来很纠结

错觉 发布于 2016/05/20 10:06
阅读 2K+
收藏 0

@JFinal 你好,想跟你请教个问题:

1. 自动生成BaseModel如果手动改了,注意下次重新生成时不要将其覆盖

有些controller的action的参数获取方式是采用如下方式获取的

String requestData = HttpKit.readData(getRequest());



因为前台ajax传递的json数据有些复杂,包含对象啊数组什么的, 这就导致我需要在BaseModel中加入新的field,我是用fastjson将json转成对象的, 而且需要验证对象有效性,就要用到hiberateValidator
@Valid
    @NotEmpty(message = "帖子数量不能为空")
    public List<DpletterPost> getPosts() {
        return posts;
    }


    public void setPosts(List<DpletterPost> posts) {
        this.posts = posts;
    }

由于BaseModel被改了, 那么下次新增表后, 重新生成一遍代码的时候就要注意不要把baseModel给覆盖掉, 经过我的测试BaseModel和_MappingKit会被覆盖,而Model不会被覆盖.

2. 对象中含有对象field的时候, 返给前台的纠结

比如Model代码为:

public class Dpletter extends BaseDpletter<Dpletter> {
	public static final Dpletter dao = new Dpletter();

	public DpletterOperator getOperator(){
		return DpletterOperator.dao.findById(getOperatorId());
	}
}



ps: dpletter文书有相关的operator操作者

在不做前后端分离的时候:

在controller中调用

Dpletter dpletter = Dpletter.dao.findById(dpLetterId);
setAttr("dpletter", dpletter);



那么在前台页面可以这样获取operator(beetl方式) 在前台会触发getOperator方法
${dpletter.operator.operatorName}

在做前后端分离只返回json时候, 就不能这么干了, 因为我希望返回的json中就包含operator的信息, 难道在Model中再加入一组operator的getter和setter吗?比如这样

public class Dpletter extends BaseDpletter<Dpletter> {
	public static final Dpletter dao = new Dpletter();

	public DpletterOperator getOperator2(){ //名字必须要改,因为与getter同名
		return DpletterOperator.dao.findById(getOperatorId());
	}

	private DpletterOperator operator; //添加新的field

	public void setOperator(DpletterOperator operator) {
		this.operator = operator;
	}

	public DpletterOperator getOperator() {
		return operator;
	}
}



然后在controller中这样?

Dpletter dpletter = Dpletter.dao.findById(dpLetterId);
        dpletter.setOperator(dpletter.getOperator2());
        renderJson(dpletter);



感觉好傻, 是我使用方式不对吗? 我真太纠结了

3. 与jfinal无关,我前台有些是jquery的,有些是vuejs的,当这两个混用的时候,更加纠结,哎~





加载中
2
理工男海哥
理工男海哥

只问答问题1

baseModel不能修改

如果要给baseModel的方法添加注解,或者甚至是添加新的方法,需要重写代码生成器。

例如:https://github.com/JpressProjects/jpress/blob/master/jpress/src/io/jpress/core/generator/JBaseModelGenerator.java

这是重写的代码生成器,添加了我自己的很多方法,当然也可以添加其他。


生成的代码如下:

https://github.com/JpressProjects/jpress/tree/master/jpress/src/io/jpress/model/base


例如:baseUser.java

/**
 * Copyright (c) 2015-2016, Michael Yang 杨福海 (fuhai999@gmail.com).
 *
 * Licensed under the GNU Lesser General Public License (LGPL) ,Version 3.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.gnu.org/licenses/lgpl-3.0.txt
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.jpress.model.base;

import io.jpress.core.JModel;
import io.jpress.model.Metadata;

import java.util.List;
import java.math.BigInteger;

import com.jfinal.plugin.activerecord.IBean;
import com.jfinal.plugin.ehcache.CacheKit;
import com.jfinal.plugin.ehcache.IDataLoader;

/**
 *  Auto generated by JPress, do not modify this file.
 */
@SuppressWarnings("serial")
public abstract class BaseUser<M extends BaseUser<M>> extends JModel<M> implements IBean {

	public static final String CACHE_NAME = "user";
	public static final String METADATA_TYPE = "user";

	public void removeCache(Object key){
		CacheKit.remove(CACHE_NAME, key);
	}

	public void putCache(Object key,Object value){
		CacheKit.put(CACHE_NAME, key, value);
	}

	public M getCache(Object key){
		return CacheKit.get(CACHE_NAME, key);
	}

	public M getCache(Object key,IDataLoader dataloader){
		return CacheKit.get(CACHE_NAME, key, dataloader);
	}

	public Metadata findMetadata(String key){
		return Metadata.findByTypeAndIdAndKey(METADATA_TYPE, getId(), key);
	}

	public List<Metadata> findMetadataList(){
		return Metadata.findListByTypeAndId(METADATA_TYPE, getId());
	}

	public M findFirstFromMetadata(String key,Object value){
		Metadata md = Metadata.findFirstByTypeAndValue(METADATA_TYPE, key, value);
		if(md != null){
			BigInteger id = md.getObjectId();
			return findById(id);
		}
		return null;
	}

	public Metadata createMetadata(){
		Metadata md = new Metadata();
		md.setObjectId(getId());
		md.setObjectType(METADATA_TYPE);
		return md;
	}

	public Metadata createMetadata(String key,String value){
		Metadata md = new Metadata();
		md.setObjectId(getId());
		md.setObjectType(METADATA_TYPE);
		md.setMetaKey(key);
		md.setMetaValue(value);
		return md;
	}

	public void setId(java.math.BigInteger id) {
		set("id", id);
	}

	public java.math.BigInteger getId() {
		Object id = get("id");
		if (id == null)
			return null;

		return id instanceof BigInteger ? (BigInteger)id : new BigInteger(id.toString());
	}

	public void setUsername(java.lang.String username) {
		set("username", username);
	}

	public java.lang.String getUsername() {
		return get("username");
	}

	public void setPassword(java.lang.String password) {
		set("password", password);
	}

	public java.lang.String getPassword() {
		return get("password");
	}

	public void setSalt(java.lang.String salt) {
		set("salt", salt);
	}

	public java.lang.String getSalt() {
		return get("salt");
	}

	public void setEmail(java.lang.String email) {
		set("email", email);
	}

	public java.lang.String getEmail() {
		return get("email");
	}

	public void setPhone(java.lang.String phone) {
		set("phone", phone);
	}

	public java.lang.String getPhone() {
		return get("phone");
	}

	public void setNickname(java.lang.String nickname) {
		set("nickname", nickname);
	}

	public java.lang.String getNickname() {
		return get("nickname");
	}

	public void setAmount(java.math.BigDecimal amount) {
		set("amount", amount);
	}

	public java.math.BigDecimal getAmount() {
		return get("amount");
	}

	public void setGender(java.lang.String gender) {
		set("gender", gender);
	}

	public java.lang.String getGender() {
		return get("gender");
	}

	public void setRole(java.lang.String role) {
		set("role", role);
	}

	public java.lang.String getRole() {
		return get("role");
	}

	public void setSignature(java.lang.String signature) {
		set("signature", signature);
	}

	public java.lang.String getSignature() {
		return get("signature");
	}

	public void setQq(java.lang.String qq) {
		set("qq", qq);
	}

	public java.lang.String getQq() {
		return get("qq");
	}

	public void setWechat(java.lang.String wechat) {
		set("wechat", wechat);
	}

	public java.lang.String getWechat() {
		return get("wechat");
	}

	public void setWeibo(java.lang.String weibo) {
		set("weibo", weibo);
	}

	public java.lang.String getWeibo() {
		return get("weibo");
	}

	public void setAvatar(java.lang.String avatar) {
		set("avatar", avatar);
	}

	public java.lang.String getAvatar() {
		return get("avatar");
	}

	public void setStatus(java.lang.String status) {
		set("status", status);
	}

	public java.lang.String getStatus() {
		return get("status");
	}

	public void setCreated(java.util.Date created) {
		set("created", created);
	}

	public java.util.Date getCreated() {
		return get("created");
	}

	public void setCreateSource(java.lang.String createSource) {
		set("create_source", createSource);
	}

	public java.lang.String getCreateSource() {
		return get("create_source");
	}

	public void setLogged(java.util.Date logged) {
		set("logged", logged);
	}

	public java.util.Date getLogged() {
		return get("logged");
	}

	public void setActivated(java.util.Date activated) {
		set("activated", activated);
	}

	public java.util.Date getActivated() {
		return get("activated");
	}

}



错觉
错觉
谢谢, 按照自己需求重写, 我还是复制一下吧
1
giianhui
giianhui
重写代码生成器,毕竟每个人需求不一样。
1
Shazi199
Shazi199
原本的设计就是basemodel自动生成覆盖,修改在model里进行,你这样使用就与原设计目的不符,应该自己重新设计生成器
0
12叔
12叔
1. 一般不都是继承BaseModel 里面改么 要baseModel 增加方法应该改自动生成的类
错觉
错觉
BaseModel里面有些getter上我要加入 注解以方便validator验证的, 没法再model里面加啊
0
12叔
12叔
2. set("xx",.getOperator2()
错觉
错觉
@Dreamlu 好的 已经这么改了
如梦技术
如梦技术
回复 @错觉 : 手动set吧,要不然你那个model每次调用到那个getOperator都会请求一次数据库
12叔
12叔
@错觉 改自动生成的代码 添加属性
错觉
错觉
这跟我那个差不多, 不过我不想用这种字符串的set,我就想用field,这样好记
0
傅小黑
傅小黑
up主头像略diao
错觉
错觉
现在不行了,胖了,那是我以前, 咱说点正事儿
0
JFinal
JFinal
晕,你在最终的 model 中写代码啊,BaseModel 本来就被设计成无语人工干预的
张无聊
张无聊
回复 @错觉 : 你应该这样问,不用注解怎么实现;你确定你这种方式是最合适的方式吗?先定义好json格式的封装类,解析后再判断有效性不好吗?
错觉
错觉
我要加注解, 用HibernateValidator进行验证, 你说不改BaseModel,怎么加注解???
返回顶部
顶部