Spring Jackson注释在春季被忽略
我试图隐藏域类中的属性,但它一直出现在输出的JSON中。我正在使用Jackson 2.0和Spring 3.1.1 /users/1的输出:Spring Jackson注释在春季被忽略,spring,jackson,Spring,Jackson,我试图隐藏域类中的属性,但它一直出现在输出的JSON中。我正在使用Jackson 2.0和Spring 3.1.1 /users/1的输出: {"id":1,"password":null,"email":"someone@somewhere.com","firstName":"John","lastName":"Smith"} 我的域类: @Entity public class User { private String mPassword; ... @JsonI
{"id":1,"password":null,"email":"someone@somewhere.com","firstName":"John","lastName":"Smith"}
我的域类:
@Entity
public class User {
private String mPassword;
...
@JsonIgnore
public String getPassword() {
return mPassword;
}
public void setPassword(String password) {
mPassword = password;
}
...
}
我的springmvc配置:
...
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="favorPathExtension" value="true" />
<property name="mediaTypes">
<map>
<entry key="json" value="application/json"/>
</map>
</property>
<property name="defaultContentType" value="application/json"/>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
</list>
</property>
</bean>
...
我的配置如下所示
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:order="1">
<property name="mediaTypes">
<map>
<entry key="html" value="text/html"/>
<entry key="json" value="application/json"/>
</map>
</property>
<property name="viewResolvers">
<!-- this is not important for your jackson problem -->
<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:viewClass="org.springframework.web.servlet.view.tiles2.TilesView" p:order="2" depends-on="tilesConfigurer"/>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
</list>
</property>
</bean>
@Controller
public class SearchController {
@RequestMapping(value="/search", method = {RequestMethod.GET, RequestMethod.POST})
public SearchResponse search(@RequestParam(value = QUERY, required = true) String query) {
return generateSearchResponse(query);
}
}
我的SearchResponse结构更复杂,但它包含这种类型的对象
@JsonIgnoreProperties({ "popis" })
public class Kurz implements Serializable {
private String nazev;
private String popis;
}
问题是Spring不适用于Jackson 2.0。这已通过以下方式解决:
<bean id="jacksonMessageConverter"
class="own.implementation.of.MappingJacksonHttpMessageConverter"/>
<bean class="org.springframework.web.servlet.mvc
.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jacksonMessageConverter"/>
</list>
</property>
<property name="requireSession" value="false"/>
</bean>
MappingJacksonHttpMessageConverter的own.implementation.of.MappingJacksonHttpMessageConverter基于以下内容:
但是请使用Jackson 2.0中的ObjectMapper和其他Jackson类,而不是Jackson 1。*对Jackson 2的支持已添加到Spring 3.1.2中(从Spring 3.2-)中。只需将您的项目从Spring 3.1.1升级到Spring 3.1.2,Jackson 2就可以使用您已有的配置。除了升级到
Spring 3.1.2
,您还必须将消息转换器更改为org.springframework.web.servlet.view.json.MappingJackson**2**HttpMessageConverter
如果您使用的是Spring4版本,则必须执行以下操作:更新依赖项
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.3</version>
</dependency>
从下面删除MediaType,它已被弃用
内容协商解决方案
,不需要,将从激活框架jar中获取,Jackson view应使用
映射Jackson2JsonView
添加属性似乎没有任何区别,可能不是必需的。请尝试在字段not getter上放置ignore注释。我认为Jackson默认情况下直接读取并设置表单字段。我担心这不起作用。我不认为它在使用Jackson——它能够在没有Jackson jar的情况下序列化JSON。另外,我不应该将@ResponseBody与ContentNegotiatingViewResolver一起使用,而是应该返回视图“json”或使用HttpMessageConverter。我想我应该降级到Jackson 1.9,这似乎可以解决我的问题。除非你需要2.0中的功能(比如传递具有双向关系的对象)。这就是我升级到2.0的原因。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.3</version>
</dependency>
import com.fasterxml.jackson.annotation.*;
<beans:property name="viewResolvers">
<beans:list>
<beans:bean
class="org.springframework.web.servlet.view.BeanNameViewResolver" />
<beans:bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<beans:bean
class="org.springframework.web.servlet.view.tiles3.TilesViewResolver">
<beans:property name="viewClass"
value="org.springframework.web.servlet.view.tiles3.TilesView"></beans:property>
<beans:property name="order" value="0"></beans:property>
</beans:bean>
</beans:list>
</beans:property>
<beans:property name="defaultViews">
<beans:list>
<beans:bean
class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />
</beans:list>
</beans:property>