10

私は RestEasy、Jboss 7、および EJB 3.1 を使用しています。JSON 形式でデータを返す RESTful Web サービスを作成しています。

問題は、@ManyToOneシリアル化中に無限再帰を引き起こすエンティティの 1 つに関係があることです。問題を解決するためにジャクソン@JsonIgnore@JsonBackReference注釈を使用しようとしましたが、完全に無視され、無限再帰がまだ発生しているようです。

これは私のユーザークラスです:

class User {
    private String userId;
    private Role role;

    @Id
    @Column(name = "\"UserId\"", unique = true, nullable = false, length = 30)
    public String getUserId() {
        return this.UserId;
    }

    public void setUserId(String UserId) {
        this.UserId = UserId;
    }

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "\"RoleId\"", nullable = false)
    //I have tried @JsonIgnore without @JsonBackReference 
    @JsonIgnore
    //I have tried @JsonBackReference without @JsonIgnore 
    //Also I have tried @JsonBackReference and @JsonIgnore together
    @JsonBackReference("role-User")
    public Role getRole() {
        return this.role;
    }
}

これは私の役割クラスの一部です:

@JsonManagedReference("role-User")
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "role")
public Set<User> getUsers() {
    return this.users;
}

通常のJaxbアノテーションを使用できるようにJacksonをアプリケーションに登録する必要があることをどこかで読んだので、クラスを作成しました

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JacksonContextResolver implements ContextResolver<ObjectMapper> {
    public JacksonContextResolver() {
        ObjectMapper mapper = new ObjectMapper();
        AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();

        mapper.getDeserializationConfig().setAnnotationIntrospector(
                introspector);
        mapper.getSerializationConfig().setAnnotationIntrospector(introspector);
    }

    public ObjectMapper getContext(Class<?> objectType) {
        return objectMapper;
    }
}

上記の問題JaxbAnnotationIntrospector()は非推奨です。

お願いします:

  • ジャクソンの注釈が無視されている理由を知っていますか?
  • Jackson の代わりに通常の JAXB XML アノテーションを使用するにはどうすればよいですか?
  • の代わりに何を使用できJaxbAnnotationIntrospector()ますか?

これらの質問への回答をお待ちしております。

アップデート:

今のところ、resteasy-jackson-provider使用を除外しjboss-deployment-structure.xml、代わりに Jettison を使用しています。私はまだジャクソンをどのように使うことができるか知りたいです!

4

6 に答える 6

6

import com.fasterxml.jackson.annotation.JsonBackReference;の代わりに使用しimport org.codehaus.jackson.annotate.JsonBackReference;ます。

それは私にとって問題でした。

于 2015-03-27T07:16:49.393 に答える
2

ほら、私はあなたに似たものを持っていて、私にとってはうまくいっています...

@JsonBackReference("promotion-travel")
@ManyToOne(cascade = CascadeType.ALL)
    @JoinTable(name="PROMOTION_TRAVEL_REL",
        joinColumns = @JoinColumn(name="TRAVEL_ID"),
        inverseJoinColumns = @JoinColumn(name="PROMOTION_ID")
)
public Promotion getPromotion(){...

そして、これは私がEntity1に持っているものです

@JsonManagedReference("promotion-travel")
@OneToMany(mappedBy="promotion")
public List<Travel> getTravelList(){...

注釈を一番上に移動すると何かが変わるかどうかはわかりませんが、それだけしかわかりません...

乾杯、

于 2013-07-17T19:36:16.353 に答える
0

私はSpring 4.0.1、hibernate 4.3.5、jackson 1.9.2、およびSTS IDEを使用しています

私は同じ例外を抱えていましたが、セッターに注釈を付けることで解決しましたが、@Transient 理由はわかりませんが、正常に動作します

これは私のエンティティクラス User.class です

    //i get that suggestion from some sites
    @JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" })
    @Entity
    @Table(name = "user", catalog = "someSchema")    
    public class User implements java.io.Serializable {

        private String name;
        private String password;
        private String username;
        private Set<Telephone> telephones = new HashSet<Telephone>(0);

        @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
        public Set<Telephone> getTelephones() {
            return this.telephones;
        }

        public void setTelephones(Set<Telephone> telephones) {
            this.telephones = telephones;
        }
    }

電話.クラス

@Entity
@Table(name = "telephone", catalog = "someSchema")
public class Telephone implements java.io.Serializable {


    private User user;
    private String telephone;

    @ManyToOne(fetch = FetchType.LAZY)

    @JoinColumn(name = "user_id", nullable = false)
    public User getUser() {
        return this.user;
    }


    @Transient  
    public void setUser(User user) {
    this.user = user;
   }

}

私のアプリケーションにjacksonを登録することに関して、私はxml構成を使用しました

   <mvc:annotation-driven>
        <mvc:message-converters>
            <bean
                class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean
                        class="web.jsonConverters.HibernateAwareObjectMapper" />
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

およびマッパークラス

public class HibernateAwareObjectMapper extends ObjectMapper {

    public HibernateAwareObjectMapper() {
        Hibernate4Module hm = new Hibernate4Module();
        registerModule(hm);
    }
}
于 2014-12-29T18:31:03.543 に答える