2013-03-13 3 views
0

Я пытаюсь создать объект json из моего объекта спящего режима, используя jackson, который можно отправить на удаленный url, используя трикотаж. Я не могу понять, как преобразовать объект спящего режима в объект json. Используя resteasy-jackson, я смог создать свой собственный веб-сервис, доступный через localhost, который корректно выводил мой json-объект на моем экране, но я надеялся построить объект json, не используя веб-сервис для собственного приложения. Возможно, я все по-другому? Я просто не хочу, чтобы вручную добавлять каждое свойство в объект json.Hibernate Entity to Json object with jackson to http post

То, что я пытался до сих пор,

интерфейс

@Path("/company") 
public interface CompanyResource { 

    @GET 
    @Produces("application/json") 
    public List<Company> getAllDomains(); 

    @POST 
    @Produces("application/json") 
    public Response post(Company company); 

    @GET 
    @Path("{id}") 
    @Produces("application/json") 
    public Company getDomainObject(@PathParam("id") Integer id); 

} 

класс

public List<Company> getAllDomains() { 
    return this.companyDAO.findAllCompanies(); 
} 

public Response post(Company company) { 
    companyDAO.updateCompany(company); 
    return Response.ok().build(); 
} 

public Company getDomainObject(@PathParam("id") Integer id) { 
    Company domainObject = this.companyDAO.findCompanyById(id); 
    if (domainObject == null) { 
     throw new WebApplicationException(Response.Status.NOT_FOUND); 
    } 
    return domainObject; 
} 

почтовая служба

public void setupRender() throws GeneralSecurityException, UnsupportedEncodingException { 
    try { 
     Client client = Client.create(); 

     String url = kayakoWebService.generateURL(); 

     WebResource webResource = client.resource(url); 

     ClientResponse response = webResource.accept("application/json").get(ClientResponse.class); 

     if (response.getStatus() != 200) { 
      throw new RuntimeException("Failed : HTTP error code : " 
        + response.getStatus()); 
     } 

     //Outputs object rather than json 
     System.out.println("test " + companyResource.getDomainObject(1)); 


    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Company.class

@Entity 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
public class Company extends StatefulEntity { 

    @Validate("maxLength=50,required") 
    private String name; 

    @Column(nullable = true) 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date createDate; 

    @Column(nullable = true) 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date cancelDate; 

    @Column(nullable = true) 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date modifyDate; 

    @ManyToOne 
    @JoinColumn(name="parent_id") 
    private Company parent; 

    @Column(nullable = true, length = 5) 
    private Integer roomUnitCount; 

    @Column(nullable = false, length = 8) 
    private String accountNumber; 

    @JsonIgnore 
    public String getAccountNumber() { 
     return accountNumber; 
    } 

    public void setAccountNumber(String accountNumber) { 
     this.accountNumber = accountNumber; 
    } 

     //additional getters setters 
    } 

cfg.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.connection.datasource">jdbc/domain</property> 
     <property name="hbm2ddl.auto">validate</property> 

     <property name="hibernate.format_sql">false</property> 
     <property name="hibernate.show_sql">false</property> 

     <property name="hibernate.cache.use_second_level_cache">true</property> 
     <property name="hibernate.cache.use_query_cache">true</property> 
     <property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property> 
     <property name="hibernate.generate_statistics">true</property> 
    </session-factory> 
</hibernate-configuration> 
+0

его не совершенно ясно, что ваша проблема. Где «companyResource» определен в вашем клиенте? Вы пытаетесь создать объект «Компания» на стороне клиента и использовать его в запросе POST на сервер? – Perception

+0

@ Компания Pepception - объект сущности спящего режима, компания Resource - это не что иное, как служба, зарегистрированная здесь http://docs.codehaus.org/display/TYNAMO/tapestry-resteasy+guide#tapestry-resteasyguide-Createapackagenamedrestforyourrservices Я просто пытаюсь захватить определенный объект компании, преобразовать его в объект json и отправить его в удаленный домен, используя трикотаж. –

+0

Можете ли вы предоставить класс компании и некоторые поддерживающие файлы. Каков ваш hb xml или где он определен. –

ответ

1

Если я понимаю, что вы пытаетесь сделать, то вы написал много кода, который не очень полезен для того, что вы пытаетесь выполнить. Во-первых, вы должны определять классы ресурсов на стороне сервера. А во-вторых, их прямое назначение чревато проблемами, это серверные компоненты, которые должны быть вызваны контейнером .

Хорошей новостью является то, что клиент Джерси довольно прочен. Он автоматически сериализует ваши объекты в соответствующем формате, при условии правильной настройки. В вашем случае вы хотите, чтобы вы включили Jersey json JAR в своего клиента. Если вы, то вы можете автоматически преобразовать объект в JSON с помощью следующего кода:

Company domainObject = companyDAO.findCompanyById(id); 
ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON) 
    .entity(domainObject, MediaType.APPLICATION_JSON) 
    .post(ClientResponse.class); 

Этот код предполагает, что сервер отвечает с экземпляром ClientResponse. Также обратите внимание, что для того, чтобы это работало, вам нужны jersey-json и Json Jackson в вашем пути к классу клиентов. При использовании Maven ее достаточным, чтобы включить эти зависимости:

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-core</artifactId> 
    <version>1.17</version> 
</dependency> 

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-client</artifactId> 
    <version>1.17</version> 
</dependency> 

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-json</artifactId> 
    <version>1.17</version> 
</dependency> 

В противном случае, вам нужно вручную включить все, минимальный набор правой банки:

  • ДЖЕКСОН-ядро-ASL-1.9.2.jar
  • jackson-jaxrs-1.9.2.jar
  • jackson-mapper-asl-1.9.2.баночка
  • ДЖЕКСОНА-хс-1.9.2.jar
  • Джерси-ядро-1.14.jar
  • Джерси-JSON-1.14.jar
  • Джерси-сервера 1.14.jar
+0

Я считаю, что это то, что я ищу. Несколько быстрых вопросов. Джексон будет выделять объекты, которые я комментирую как @JsonIgnor, будет ли это продолжаться? Наконец, я получаю это исключение, вы бы знали, что это значит? com.sun.jersey.api.client.ClientHandlerException: com.sun.jersey.api.client.ClientHandlerException: писатель тела сообщения для типа Java, класс com.communication.domain.entities.Company и тип носителя MIME, приложение/json, не найден –

+0

@George - 1) Да, все аннотации Джексона на объектах сущности будут обрабатываться как обычно. 2) Убедитесь, что вы включили все необходимые JAR (jersey-json, jackson-core-asl, jackson-jaxrs и jackson-mapper). – Perception

+0

Я обновил все банки, у меня не было трикотажа, поэтому я установил пакет. Во всяком случае, я все еще получаю это исключение. Должен ли я аннотировать мой метод getCompany в моем dao с чем-то вроде этого @Produces (MediaType.APPLICATION_JSON)? –

0

Если я вас понял, а вы ищете для преобразования объектов Java в их соответствующие JSON представлений. Это называется JSON сериализации и у вас есть некоторые ссылки здесь, в «StackOverflow» сам разговор по этому поводу

  1. A better Java JSON library?
  2. Java JSON serialization - best practice