2013-05-30 4 views
7

Я пытаюсь создать приложение с угловыми и springmvc.I имеет два класса провинции и Comunidad. :Как сериализовать ленивые загруженные объекты с помощью hibernate модуля jackson?

@Entity(name="Provincia") 
@Table(name="T_PROVINCIA") 
public class Provincia implements Serializable{ 


private String idProvincia; 
private String nombre;  
private Comunidad refComunidad; 

public Provincia() { 
} 

@Id 
@TableGenerator(name="provinciaGen", 
       table="T_GENERATOR", 
       pkColumnName="ID_GENERATOR", 
       pkColumnValue="ID_PROVINCIA", 
       valueColumnName="ID_VALUE") 
@GeneratedValue(generator="provinciaGen",strategy=GenerationType.TABLE) 
@Column(name="ID_PROVINCIA") 
public String getIdProvincia() { 
    return idProvincia; 
} 

@Column(name="NOMBRE") 
public String getNombre() { 
    return nombre; 
} 

@ManyToOne(targetEntity=Comunidad.class, fetch=FetchType.LAZY) 
@JoinColumn(name="ID_COMUNIDAD") 
public Comunidad getRefComunidad() { 
    return refComunidad; 
} 
setters 
..... 
..... 
} 

@Entity(name="Comunidad") 
@Table(name="T_COMUNIDAD") 
public class Comunidad implements Serializable{ 

@Id 
@TableGenerator(name="comunidadGen", 
       table="T_GENERATOR", 
       pkColumnName="ID_GENERATOR", 
       pkColumnValue="ID_COMUNIDAD", 
       valueColumnName="ID_VALUE") 
@GeneratedValue(generator="comunidadGen",strategy=GenerationType.TABLE) 
@Column(name="ID_COMUNIDAD") 
private String idComunidad; 

@Column(name="NOMBRE") 
private String nombre; 

@Column(name="SHORTNAME") 
private String shortName; 

public Comunidad() { 
} 

getters and setters 
............... 
} 

В моем контроллере:

@RequestMapping("/userlist.json") 
public @ResponseBody List<Provincia> getUserList(){ 
    return this.provinciaService.loadAllProvincias(); 
} 

И я получаю эту ошибку: /* Нет сериалайзера найденного для класса org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer и
без свойств обнаружено создание BeanSerializer (во избежание исключения отключить
SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS)) (через цепочку ссылок: java.util.ArrayList [0] -> admin.domain.Provincia ["refC omunidad "] - < admin.domain.Comunidad $$ EnhancerByCGLIB $$ 68ea9e6f [" hibernateLazyInitializer "]) */

Я прочитал на GitHub о Джексоне модуля спящего режиме является хорошим выбором для решения
проблем: https://github.com/FasterXML/jackson-module-hibernate. я включил модуль спящего режима зависимость Джексоном в моей pom.xml

<dependency> 
     <groupId>com.fasterxml.jackson.datatype</groupId> 
     <artifactId>jackson-datatype-hibernate4</artifactId> 
     <version>2.2.0</version> 
</dependency> 

Но я не знаю, где настроить «Hibernate4Module.Feature.FORCE_LAZY_LOADING, правда». Я стараюсь следить за показаниями с этой страницы http://blog.pastelstudios.com/2012/03/12/spring-3-1-hibernate-4-jackson-module-hibernate/

, но я получаю ту же ошибку.

Есть ли кто-нибудь, кто может мне помочь с легким примером, пожалуйста?

ответ

10

Вы можете попробовать это. Это помогает мне.

ObjectMapper mapper = new ObjectMapper(); 

Hibernate4Module hbm = new Hibernate4Module(); 
hbm.enable(Hibernate4Module.Feature.FORCE_LAZY_LOADING); 

mapper.registerModule(hbm); 
ObjectWriter w = mapper.writer(); 
String result = null; 
try { 
    result = w.writeValueAsString(o); 
} catch (JsonProcessingException e) { 
    e.printStackTrace(); 
} 
0

У меня есть точная проблема, и вот мое решение.

public class YourObjectMapper extends ObjectMapper { 

    @PostConstruct 
    public void afterPropertiesSet() throws Exception { 
     getSerializationConfig().set(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false); 
    } 
} 

р/с: действительно только для 1.9.x org.codehaus.jackson.map.ObjectMapper и не 2.x Джексона.

+2

Для Джексона 2.x, используйте 'ObjectMapper Mapper = новый ObjectMapper();' ' MAPPER.configure (SerializationFeature.FAIL_ON_EMPTY_BEANS, ложные);' Тем не менее, ни один из этих ответов, казалось, чтобы помочь моей подобной проблемой. – Marcus

3

Это, как я получил это работает, я использую Resteasy на JBoss WildFly

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
public class JacksonConfig implements ContextResolver<ObjectMapper> { 
    @Override 
    public ObjectMapper getContext(Class<?> type) { 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.registerModule(new Hibernate4Module()); 
     return mapper; 
    } 
} 
+0

Какие версии? –

+0

Я должен был упомянуть ... Слишком давно назад. Вероятно, это были последние версии, когда я начал их использовать, начало 2015 года – RoyB

+0

aight, я не уверен, но я не думаю, что это работает в Jackson 2.x и RESTEasy Jackson 2 provider 3.x. Мне нужен кто-то другой, чтобы проверить его. –

Смежные вопросы