Java Hibernate实体到Json对象,jackson到http post
我正在尝试使用jackson从hibernate实体创建一个json对象,该对象可以使用jersey发布到远程url。我似乎不知道如何将hibernate实体转换为json对象。使用resteasy jackson,我能够创建自己的web服务,该服务可由localhost访问,并在屏幕中正确输出json对象,但我希望构建json对象而不必在自己的应用程序中使用web服务。也许我做得不对?我只是不想手动将每个属性添加到json对象中 到目前为止我所尝试的 接口Java Hibernate实体到Json对象,jackson到http post,java,json,web-services,jersey,jackson,Java,Json,Web Services,Jersey,Jackson,我正在尝试使用jackson从hibernate实体创建一个json对象,该对象可以使用jersey发布到远程url。我似乎不知道如何将hibernate实体转换为json对象。使用resteasy jackson,我能够创建自己的web服务,该服务可由localhost访问,并在屏幕中正确输出json对象,但我希望构建json对象而不必在自己的应用程序中使用web服务。也许我做得不对?我只是不想手动将每个属性添加到json对象中 到目前为止我所尝试的 接口 @Path("/company")
@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);
}
公司级
@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>
jdbc/域
验证
假的
假的
真的
真的
net.sf.ehcache.hibernate.EhCacheRegionFactory
真的
如果我对您的理解很好,那么您正在寻找将Java对象转换为匹配的JSON表示。这被称为JSON序列化,您在“stackoverflow”中有一些关于这一问题的链接
如果我了解您正在尝试做什么,那么您已经编写了很多代码,这些代码对于您正在尝试完成的任务来说不是很有用。首先,您应该只在服务器端定义资源类。其次,直接调用它们充满了问题,它们是应该由容器调用的服务器组件 好消息是,泽西岛的客户非常健壮。只要设置正确,它将自动将对象序列化为适当的格式。在您的情况下,您需要确保在客户端中包含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和Jackson JAR,这样才能工作。如果使用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>
泽西岛
球衣核心
1.17
泽西岛
泽西岛客户
1.17
泽西岛
泽西json
1.17
否则,您需要手动包括所有正确的JAR,最小设置:
- jackson-core-asl-1.9.2.jar
- jackson-jaxrs-1.9.2.jar
- jackson-mapper-asl-1.9.2.jar
- jackson-xc-1.9.2.jar
- jersey-core-1.14.jar
- jersey-json-1.14.jar
- jersey-server-1.14.jar
companyResource
?您是否试图在客户端创建公司
对象,并将其用于服务器的POST请求中?@Perception Company是hibernate实体对象,companyResource只是一个记录在这里的服务,我只是想获取一个特定的公司对象,将其转换为json对象,并使用jersey将其发布到远程域。你能提供公司类和一些支持文件吗。你的hb xml是什么或者它是在哪里定义的。添加了额外的类。我为没有把这个问题说得更清楚而道歉。我只是对创建web服务非常陌生。我的目标是构建一个json对象,并将其发布到远程url“restful”中,远程url可以处理json对象。几个简短的问题。Jackson将发射我注释为@JsonIgnor的对象,这种情况还会发生吗?最后,我收到了这个例外,你知道它是什么意思吗?com.sun.jersey.api.client.ClientHandlerException:com.sun.jersey.api.client.ClientHandlerException:未找到Java类型、类com.communication.domain.entities.Company和MIME媒体类型application/json的消息体编写器found@George-1)是的,实体对象上的所有Jackson注释将正常处理。2) 确保包含所有必需的jar(jersey json、jackson core asl、jackson jaxrs和jackson mapper)。我更新了所有jar,缺少一个jersey jar,因此安装了该包。不管怎样,我仍然收到那个例外。我应该在dao中用@products(MediaType.APPLICATION_JSON)这样的东西来注释我的getCompany方法吗?尝试添加final ClientConfig=new DefaultClientConfig();config.getFeatures().put(JSONConfiguration.FEATURE\u POJO\u映射,Boolean.TRUE)代码>就在客户端前面。创建行。Aso,将Client.create
更改为Client.create(config)
。谢谢,你帮了我很多忙。非常感谢。
Company domainObject = companyDAO.findCompanyById(id);
ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON)
.entity(domainObject, MediaType.APPLICATION_JSON)
.post(ClientResponse.class);
<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>