@JsonAutoDetect (class)
这是作用于类的annotation,主要用于指明该类使用annotation,并且可以自动侦测getter,setter,构造方法,以便生成json对象
@JsonIgnore (method/field):作用于方法或字段,用来表明,当生成json的时候忽略有该annotation的方法或字段
@JsonIgnoreProperties
(value = { "hibernateLazyInitializer"
, "password"
}) ,主要用于过滤掉一些不需要的属性
代码:
@Entity
@Cache
(usage = CacheConcurrencyStrategy.READ_WRITE)
@JsonAutoDetect
/**
* 在此标记不生成json对象的属性,这里我标记了两个属性一个hibernateLazyInitializer属性,为什么要标记这个
* 属性参考前面的博文,一个password属性,出于安全这个当然不能转换成json对象了,毕竟json是在前台调用的,
* 如果你想转换的时候忽略某个属性,可以在后面继续加上
*/
@JsonIgnoreProperties
(value = { "hibernateLazyInitializer"
, "password"
})
public class User
{
private Long id;
private String name;
private String password;
private String email;
private Date createAt;
@Id
@GeneratedValue
(strategy = GenerationType.IDENTITY)
public Long getId() {
return id;
}
public void setId(Long id) {
this .id = id;
}
/**
* 转换日期对象的输出格式,CustomDateSerializer 代码参考前面的博文
*/
@JsonSerialize
(using = CustomDateSerializer.
class )
public Date getCreateAt() {
return createAt;
}
public void setCreateAt(Date createAt) {
this .createAt = createAt;
}
/**
* 其他的getter和setter省略
*/
}
@Namespace
( "/security/user"
)
public class UserAction
extends ActionSupport
{
@Action
( "list"
)
public String list()
throws Exception {
// 取得所有的用户
List<User> list = userService.getAll();
response = ServletActionContext.getResponse();
// jackson
ObjectMapper mapper =
new ObjectMapper();
// 把取得的用户list写入response
mapper.writeValue(response.getWriter(), list);
return null ;
}
}
hibernate延时加载因为jsonplugin用的是java的内审机制.hibernate会给被管理的pojo加入一个 hibernateLazyInitializer属性,jsonplugin会把hibernateLazyInitializer也拿出来操作,并读取里面一个不能被反射操作的属性就产生了这个异常.
不过我用的是jackson来转json,所以想到了用annotation来排除hibernateLazyInitializer 这个属性
在你的pojo类声明加上:
@JsonIgnoreProperties
(value={ "hibernateLazyInitializer"
})
转换格式设置近日,使用Jackson转化JSON对象的时候,显示的时候,日期始终显示不正确,输出的日期是一串数字代表的时间戳,不符合要求,所以想到Jackson应当有方法设置输出的日期格式。后来一查果然有两种方式来实现:
1.普通的方式:
默认是转成timestamps形式的,通过下面方式可以取消timestamps。 这样将使时间生成使用所谓的use a [
ISO-8601]-compliant notation, 输出类似如下格式的时间: "1970-01-01T00:00:00.000+0000
2.objectMapper.getSerializationConfig().setDateFormat(myDateFormat); myDateFormat对象为java.text.DateFormat,具体使用清查java API
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;
/**
* java日期对象经过Jackson库转换成JSON日期格式化自定义类
* @author godfox
* @date 2010-5-3
*/
public class CustomDateSerializer
extends JsonSerializer<Date> {
@Override
public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
SimpleDateFormat formatter =
new SimpleDateFormat( "yyyy-MM-dd"
);
String formattedDate = formatter.format(value);
jgen.writeString(formattedDate);
}
}