一个上市公司竟然无法解决html尖角号的问题,我也是很无奈,自己实现了一个html过滤器。
解决问题:修改@ResponseBody返回值。
1.ExampleEntity类,首先定义模型,使用@JsonSerialize注解指定序列化类,@JsonIgnore注解序列化忽略,@JsonFormat注解格式化时间格式。
package com.jc.bus.example.entity; import java.util.Date; import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.jc.bus.example.serializer.ExampleSerializer; @JsonSerialize(using = ExampleSerializer.class) public class ExampleEntity { private String username; @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date date; @JsonIgnore private int age; private Double money; private List<String> ls; public Double getMoney() { return money; } public void setMoney(Double money) { this.money = money; } public List<String> getLs() { return ls; } public void setLs(List<String> ls) { this.ls = ls; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } }
2.ExampleSerializer序列化主类,也就是实体类注解指定序列化实现类,继承了JsonSerializer接口,实现其方法既可以。
package com.jc.bus.example.serializer; import java.io.IOException; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.jc.bus.example.entity.ExampleEntity; import com.jc.spring.extend.JacksonSerializerUtil; public class ExampleSerializer extends JsonSerializer<ExampleEntity> { @Override public void serialize(ExampleEntity value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException { // TODO Auto-generated method stub gen.writeStartObject(); JacksonSerializerUtil.writeParm(gen, value); gen.writeEndObject(); } }
3.JacksonSerializerUtil工具类,这里我本想实现一个通用模型,但是最后并没有写完,这里实现了基本类型的通用方法,已经满足日常的需求了。
package com.jc.spring.extend; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.math.BigDecimal; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import com.fasterxml.jackson.core.JsonGenerator; public class JacksonSerializerUtil { //com.fasterxml.jackson.annotation.JsonIgnore; /** * Jackson序列话参数写入标准实现 * @param gen * @param value */ public static void writeParm(JsonGenerator gen, Object value){ Class<? extends Object> classTemp = value.getClass(); Field[] fields = classTemp.getDeclaredFields(); try { for (int i=0; i<fields.length; i++){ Field field = fields[i]; field.setAccessible(true); if(field.isAnnotationPresent(com.fasterxml.jackson.annotation.JsonIgnore.class)){ continue; } //字段类型 Class<?> type = field.getType(); String fieldName = field.getName(); PropertyDescriptor pd=new PropertyDescriptor(fieldName,classTemp); Method method = pd.getReadMethod(); Object obj = method.invoke(value); //判断是否是null,给出默认值 boolean flag = obj==null; if (flag){ gen.writeStringField(fieldName, ""); continue; } if (type == String.class){ gen.writeStringField(fieldName, HtmlFilter.doHtmlFilter((String)obj)); }else if (type==Long.class){ gen.writeNumberField(fieldName, (Long)obj); }else if (type==Integer.class){ gen.writeNumberField(fieldName, (Integer)obj); }else if (type==Short.class){ gen.writeNumberField(fieldName, (Short)obj); }else if (type==Float.class){ gen.writeNumberField(fieldName, (Float)obj); }else if (type==Double.class){ gen.writeNumberField(fieldName, (Double)obj); }else if (type==BigDecimal.class){ gen.writeNumberField(fieldName, (BigDecimal)obj); }else if (type==byte[].class){ gen.writeBinaryField(fieldName, (byte[])obj); }else if (type==Date.class){ if (field.isAnnotationPresent(com.fasterxml.jackson.annotation.JsonFormat.class)){ com.fasterxml.jackson.annotation.JsonFormat jf = field.getAnnotation(com.fasterxml.jackson.annotation.JsonFormat.class); String pattern = jf.pattern(); DateFormat df = new SimpleDateFormat(pattern); gen.writeStringField(fieldName, df.format((Date)obj)); }else{ DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); gen.writeStringField(fieldName, df.format((Date)obj)); } }else if (type==List.class){ gen.writeArrayFieldStart(fieldName); List list = (List)obj; for (Object element : list){ writeBaseType(gen, element); } gen.writeEndArray(); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void writeBaseType(JsonGenerator gen, Object field){ try { boolean flag = field==null; //字段类型 if (flag){ return ; } if (field instanceof String){ gen.writeString(HtmlFilter.doHtmlFilter((String)field)); }else if (field instanceof Long){ gen.writeNumber((Long)field); }else if (field instanceof Integer){ gen.writeNumber((Integer)field); }else if (field instanceof Short){ gen.writeNumber((Short)field); }else if (field instanceof Float){ gen.writeNumber((Float)field); }else if (field instanceof Double){ gen.writeNumber((Double)field); }else if (field instanceof BigDecimal){ gen.writeNumber((BigDecimal)field); }else if (field instanceof byte[]){ gen.writeBinary((byte[])field); }else if (field instanceof Date){ DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); gen.writeString(df.format((Date)field)); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
4.HtmlFilter转换工具类,修改html特殊字符。
package com.jc.spring.extend; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.aspectj.lang.annotation.Aspect; @Aspect public class HtmlFilter { private static Map<Character, String> filterMap = new HashMap<Character, String>(); static { filterMap.put('\"', """); filterMap.put('&', "&"); filterMap.put('<', "<"); filterMap.put('>', ">"); filterMap.put('\'', "'"); filterMap.put('\\', "\"); } /** * 在get*方法体里调用,自动转换字符 * @param parm * @return */ public static String doHtmlFilter (String parm){ //最终返回参数 StringBuilder reString = new StringBuilder(""); char[] chars = parm.toCharArray(); for (int i=0; i<chars.length; i++){ Character c = chars[i]; Set<Entry<Character, String>> entry = filterMap.entrySet(); boolean bflag = true; for (Entry<Character, String> filterEntry : entry){ Character convertChar = filterEntry.getKey(); if (c.equals(convertChar)){ reString.append(filterEntry.getValue()); bflag = false; break; } } if (bflag){ reString.append(c); } } return reString.toString(); } }
5.这里需要注意一定要把jackson注入。
@Bean public JacksonAnnotationIntrospector jacksonAnnotationIntrospector() { return new JacksonAnnotationIntrospector(); } @Bean(name = "objectMapper") public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); mapper.configure(SerializationFeature.INDENT_OUTPUT, false); mapper.setAnnotationIntrospector(jacksonAnnotationIntrospector()); mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); return mapper; }
相关推荐
Jackson是Java中广泛使用的JSON库,它可以高效地处理JSON序列化和反序列化。在Spring MVC中,Jackson是默认的JSON处理器,通过`ObjectMapper`类进行数据转换。Spring MVC还提供了`@JsonView`注解来控制JSON响应中的...
7. **Jackson 或 Gson**:用于 JSON 数据的序列化和反序列化,例如 `jackson-databind.jar`、`jackson-core.jar` 和 `jackson-annotations.jar`,或者 `gson.jar`。 8. **Dojo 或 jQuery**:如果在前端使用 ...
- **JSON**:Spring MVC使用Jackson库来序列化和反序列化JSON数据。`@RequestBody`用于将请求体中的JSON数据转换为Java对象,而`@ResponseBody`则将方法的返回值转换为JSON发送回客户端。 - **XML**:对于XML,...
如果需要自定义JSON序列化的行为,例如忽略某些字段或使用特定的日期格式,可以使用Jackson的`@JsonInclude`、`@JsonFormat`等注解。还可以创建自定义的`JsonSerializer`和`JsonDeserializer`实现特定逻辑。 6. **...
1. **添加依赖**:在项目中引入Spring的Web服务模块(如`spring-ws-core`),以及可能需要的其他依赖,如`jackson-databind`用于JSON序列化。 2. **创建WSDL**:定义Web服务的接口,这通常是一个WSDL(Web Service ...
四、使用Jackson序列化与反序列化 1. 序列化:将Java对象转换为JSON ```java import com.fasterxml.jackson.databind.ObjectMapper; // 创建一个对象 MyObject obj = new MyObject(); // 使用ObjectMapper将其转换...
7. **Jackson或Gson**:用于JSON数据的序列化和反序列化,Spring MVC默认支持这两种库,便于前后端数据交换。 8. **Hibernate或MyBatis**:如果应用需要持久化数据,这些ORM(对象关系映射)框架可以与Spring MVC...
9. **JSON 支持**: 通过集成 Jackson 或者 Gson,Spring MVC 可以方便地进行 JSON 数据的序列化和反序列化,用于 RESTful API 的开发。 10. **上传下载支持**: Spring MVC 提供了文件上传和下载的功能,通过 `...
创建Spring MVC项目时,需要在`pom.xml`文件中添加Spring MVC、Spring核心以及其他依赖,如Spring Web和Jackson库(用于JSON序列化和反序列化)。 10. **IDE集成** 使用Eclipse、IntelliJ IDEA等IDE,可以快速...
Spring MVC项目会依赖Spring Framework的相应模块,以及其他如Jackson、Thymeleaf等库,以实现JSON序列化、模板引擎等功能。 6. **Lib**或**lib**目录(如果使用非构建工具管理依赖):这里包含项目所需的JAR库,如...
在 Model 类中,我们可以使用这些注解来定制序列化和反序列化的行为。 4. **控制器方法的编写**:在 Spring MVC 的控制器类中,我们可以定义处理 HTTP 请求的方法,并使用 `@RequestBody` 和 `@ResponseBody` 注解...
此外,为了提供JSON格式的数据交换,你可能还需要使用如Jackson或Gson这样的库进行序列化和反序列化。 总结来说,"Spring MVC REST Demo"项目展示了如何在Spring MVC框架中利用REST原则创建Web服务。这包括定义...
这些转换器允许我们将Java对象序列化成适合HTTP传输的格式,如JSON或XML,同时也能够将接收到的HTTP请求数据反序列化回Java对象。 `MappingJackson2HttpMessageConverter`是Spring MVC中用于处理JSON数据的典型转换...
11. **jackson或者gson.jar**:JSON序列化和反序列化的库,Spring MVC通常使用它们将Java对象转换为JSON格式,以便于前后端的数据交换。 12. **validation-api.jar** 和 **hibernate-validator.jar**:用于执行Bean...
15. **json处理库**:如Jackson或Gson,用于JSON序列化和反序列化,便于前后端数据交换。 在构建Spring MVC项目时,这些jar包需要添加到项目的类路径中,以确保所有依赖能够正确解析并运行。通常,现代的构建工具如...
默认情况下,Spring MVC使用`HttpMessageConverter`来完成这个转换,其中最常用的转换器是`MappingJackson2HttpMessageConverter`,它依赖于Jackson库来序列化对象为JSON。 接下来,我们将探讨如何实现JSON数据的...
10. **其他依赖**: 包括 Servlet API、JSTL、Commons Logging、Jackson/JSON-P/JSON-B 等,用于完成 HTTP 交互、日志记录、JSON 序列化等任务。 在"spring-MVC整合jar包"中,包含了以上所述的关键组件和它们的依赖...
与之配套的是Jackson库,这是一款高效的JSON处理库,常用于Spring MVC应用中进行数据序列化和反序列化。 在使用Spring Framework 4.3.8时,确保你的Java Development Kit (JDK)版本至少是1.8。这是由于Spring框架4....
当我们在Spring MVC应用中尝试将包含循环引用的对象序列化为JSON时,Jackson(默认的JSON处理库)会尝试无限次地深入对象图进行序列化,最终导致堆栈溢出错误(StackOverflowError)。例如,在上述部分日志中,`Album`...
- Jackson 或 Gson jar 包用于 JSON 数据的序列化和反序列化,这对于现代 Web API 开发至关重要。 10. **测试支持**: - spring-test 和 mockito 等库用于编写单元测试和集成测试,确保 Spring MVC 应用的功能...