杰克逊的注释在春天被忽略了

Mar*_*gan 15 spring jackson

我正在尝试隐藏域类中的属性,但它一直出现在输出的JSON中.我正在使用Jackson 2.0和Spring 3.1.1

输出/ users/1:

{"id":1,"password":null,"email":"someone@somewhere.com","firstName":"John","lastName":"Smith"}
Run Code Online (Sandbox Code Playgroud)

我的域名类:

@Entity
public class User {
    private String mPassword;
    ... 
    @JsonIgnore
    public String getPassword() {
        return mPassword;
    }

    public void setPassword(String password) {
        mPassword = password;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我的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>
...
Run Code Online (Sandbox Code Playgroud)

而我的控制器:

@Controller
@RequestMapping("/users")
public class UserController {
    private UserService mUserService;

    public UserController(){}

    @Inject
    public void setUserController(UserService userService){
        mUserService=userService;
    }

    @RequestMapping(value="/{id}", method=RequestMethod.GET)
    public void getUser(@PathVariable("id") long id, Model model){
        model.addAttribute(mUserService.getUser(id));
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*øld 11

Spring 3.1.2中增加了对Jackson 2的支持(从Spring 3.2 - SPR-9507向后移植).只需将项目从Spring 3.1.1升级到Spring 3.1.2,Jackson 2就可以使用您已有的配置.


Eug*_*sky 10

问题是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>
Run Code Online (Sandbox Code Playgroud)

而且.MappingJacksonHttpMessageConverter的own.implementation.of基于这个:

http://www.jarvana.com/jarvana/view/org/springframework/spring-web/3.0.0.RELEASE/spring-web-3.0.0.RELEASE-sources.jar!/org/springframework/http/converter /json/MappingJacksonHttpMessageConverter.java?format=ok

但是使用来自Jackson 2.0而不是Jackson 1的ObjectMapper和其他Jackson类.*


Jef*_*say 8

除了升级到Spring 3.1.2,您还必须将消息转换器更改为 org.springframework.web.servlet.view.json.MappingJackson**2**HttpMessageConverter


San*_*ngh 8

如果您使用的是Spring 4版本,则必须执行以下操作,即更新依赖项

<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>
Run Code Online (Sandbox Code Playgroud)

将旧的codehaus注释导入替换为以下,如果不这样做,像JsonIgnoreProperties这样的旧注释将无法与新版本的Jackson一起使用

import com.fasterxml.jackson.annotation.*;
Run Code Online (Sandbox Code Playgroud)

从下面删除mediaTypes,它已被弃用.

ContentNegotiatingViewResolver

,不需要,将从激活框架jar中获取,Jackson视图应该使用

MappingJackson2JsonView

<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>
Run Code Online (Sandbox Code Playgroud)