web-dev-qa-db-fra.com

Spring @JsonIgnore ne fonctionne pas

Comment puis-je obtenir @JsonIgnore au travail, j'ai un cours. Et même si je mets l'annotation ici, cela n'a aucun effet sur la sortie. J'utilise Jackson.

public class QuestionBlock implements ComparableByID{


    int ID;

    String title;
    String description;
    boolean deleted;
    boolean isDraft;
    boolean visible;
    Timestamp modifiedDate;
    String modifiedBy;


    private List<Question> questions =  new ArrayList<>();

    @JsonIgnore
    private List<Survey> surveys =  new ArrayList<>();

    ...

    @JsonIgnore
    public List<Survey> getSurveys() {
        return surveys;
    }

    @JsonIgnore
    public void setSurveys(List<Survey> surveys) {
        this.surveys = surveys;
    }

}

Ceci est ma méthode de contrôleur:

@RequestMapping(value = "/questionBlock/{id}",produces = "application/json;charset=UTF-8")
    @ResponseBody
    public QuestionBlock getQuestionBlock(@PathVariable("id") int id) {
        return surveyService.getQuestionBlock(id);
    }

Voici mon servlet-context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">

    <mvc:annotation-driven />


    <mvc:resources mapping="/resources/**" location="/resources/" />
    <mvc:resources location="/, classpath:/META-INF/web-resources/"
        mapping="/resources/**" />

    <context:property-placeholder location="classpath*:META-INF/*.properties" />


    <context:component-scan base-package="com.adam.czibere" />



    <bean class="org.Apache.commons.dbcp.BasicDataSource" destroy-method="close" id="myDataSource" name="dataSource">
        <property name="driverClassName" value="${database.driverClassName}" />
        <property name="url" value="${database.url}" />
        <property name="username" value="${database.username}" />
        <property name="password" value="${database.password}" />
        <property name="testOnBorrow" value="true" />
        <property name="testOnReturn" value="true" />
        <property name="testWhileIdle" value="true" />
        <property name="timeBetweenEvictionRunsMillis" value="1800000" />
        <property name="numTestsPerEvictionRun" value="3" />
        <property name="minEvictableIdleTimeMillis" value="1800000" />
        <property name="validationQuery" value="SELECT 1" />
    </bean>


    <bean id="mySessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource" />
        <property name="packagesToScan">
            <array>
                <value>com.adam.czibere</value>
            </array>
        </property>
        <property name="hibernateProperties">
            <value>
                hibernate.dialect=org.hibernate.dialect.MySQLDialect
            </value>
        </property>
    </bean>

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="mySessionFactory" />
    </bean>


    <tx:annotation-driven transaction-manager="transactionManager"/>

<bean
        class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="mediaTypes">
            <map>
                <entry key="html" value="text/html" />
                <entry key="json" value="application/json" />
            </map>
        </property>
        <property name="viewResolvers">
            <list>
                <bean
                    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                    <property name="prefix" value="/WEB-INF/views/" />
                    <property name="suffix" value=".jsp" />
                </bean>
            </list>
        </property>
        <property name="defaultViews">
            <list>
                <bean
                    class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
                    <property name="prefixJson" value="false" />
                    <property name="objectMapper" ref="jacksonObjectMapper" />
                </bean>
            </list>
        </property>
    </bean>
    <bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper" />
    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean
                    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                    <property name="prefixJson" value="false" />
                    <property name="supportedMediaTypes" value="application/json" />
                </bean>
            </list>
        </property>
    </bean>
</beans>
21
czadam

J'ai enfin trouvé une solution. J'ai changé la déclaration d'importation de

import org.fasterxml.jackson.annotate.JsonIgnore;

à 

import org.codehaus.jackson.annotate.JsonIgnore;

En gros, vous devez vous assurer que vous utilisez la même classe partout.

65
czadam

L'annotation ne devrait être que sur les méthodes 'get'. Vous semblez avoir @Json ... des annotations sur vos champs privés.

4
Steve

Si vous utilisez une implémentation de Jackson et que ses annotations ne fonctionnent pas, c'est probablement parce que vous avez une autre dépendance de jackson avec une priorité supérieure. Par conséquent, si vous voulez vous assurer que certaines implémentations de jackson prevales (à mon humble avis, le meilleur choix est celui avec lequel toutes les classes ont déjà été annotées, car probablement avec d’autres dépendances), spécifiez cette dépendance dans le pom du module d’application. Donc, si vous avez dans plusieurs modules toutes vos entités annotées avec

import org.fasterxml.jackson.annotate.JsonIgnore;

Au lieu de remplacer toutes les importations, spécifiez simplement la dépendance correspondante dans le pom de l'application:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>

Cela précisera à Spring Boot qu'il s'agit de la mise en œuvre que vous souhaitez utiliser.

3
EliuX

J'ai fait face au même problème lorsque je travaillais avec Spring et Hibernate. La raison en était que, dans la classe entity, j'utilisais org.codehaus.jackson.JsonIgnore et qu'au printemps j'utilisais com.fasterxml.jackson.jaxrs.JsonIgnore. Corrigez une bibliothèque dans les deux couches et le problème disparaîtra.

0
tanson

Vous devez changer votre version de org.codehaus.jackson . J'utilise actuellement la version 1.1.1 dans laquelle @JsonIgonre Ne fonctionne pas .. .

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-jaxrs</artifactId>
        <version>1.1.1</version>
    </dependency>

    Change to 

   <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-jaxrs</artifactId>
        <version>1.9.13</version>
    </dependency>

Et le code Java est: -

import Java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import org.codehaus.jackson.annotate.JsonIgnore;

@Entity
@Table(name="users")
public class Users implements Serializable{

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;
    private String username;
    private String firstname;
    @JsonIgnore
    private String lastname;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

}
0
Pankaj Verma