Webサービスは初めてです。 Javaでjersey JAX-RSを使用してデータベースにデータを挿入および取得する方法を提案してください。
以下は、 JAX-RS サービスが [〜#〜] jpa [〜#〜] を使用してセッションBeanとして実装された例です。永続化および [〜#〜] jaxb [〜#〜] は、次のようになります。
CustomerService
package org.example;
import Java.util.List;
import javax.ejb.*;
import javax.persistence.*;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
@Stateless
@LocalBean
@Path("/customers")
public class CustomerService {
@PersistenceContext(unitName="CustomerService",
type=PersistenceContextType.TRANSACTION)
EntityManager entityManager;
@POST
@Consumes(MediaType.APPLICATION_XML)
public void create(Customer customer) {
entityManager.persist(customer);
}
@GET
@Produces(MediaType.APPLICATION_XML)
@Path("{id}")
public Customer read(@PathParam("id") long id) {
return entityManager.find(Customer.class, id);
}
@PUT
@Consumes(MediaType.APPLICATION_XML)
public void update(Customer customer) {
entityManager.merge(customer);
}
@DELETE
@Path("{id}")
public void delete(@PathParam("id") long id) {
Customer customer = read(id);
if(null != customer) {
entityManager.remove(customer);
}
}
@GET
@Produces(MediaType.APPLICATION_XML)
@Path("findCustomersByCity/{city}")
public List<Customer> findCustomersByCity(@PathParam("city") String city) {
Query query = entityManager.createNamedQuery("findCustomersByCity");
query.setParameter("city", city);
return query.getResultList();
}
}
お客様
以下は、エンティティの1つの例です。 JPAアノテーションとJAXBアノテーションの両方が含まれています。
package org.example;
import Java.io.Serializable;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlRootElement;
import Java.util.Set;
@Entity
@NamedQuery(name = "findCustomersByCity",
query = "SELECT c " +
"FROM Customer c " +
"WHERE c.address.city = :city")
@XmlRootElement
public class Customer implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private long id;
@Column(name="FIRST_NAME")
private String firstName;
@Column(name="LAST_NAME")
private String lastName;
@OneToOne(mappedBy="customer", cascade={CascadeType.ALL})
private Address address;
@OneToMany(mappedBy="customer", cascade={CascadeType.ALL})
private Set<PhoneNumber> phoneNumbers;
}
詳細情報
[〜#〜]更新[〜#〜]
必要な瓶は何ですか
JAX-RS/EJB/JPA/JAXBアプリケーションを任意のJava EE 6準拠のアプリケーションサーバーにデプロイすることができ、追加のサーバーをセットアップする必要はありません。JAX-RSAPIを取得できるクライアントのプログラミングJersey( http://jersey.Java.net/ )から、およびEclipseLinkからのJPAおよびJAXB API( http://www.Eclipse.org/eclipselink/ =)。
データベース接続が書き込まれる場所
JDBCリソースと接続プール
アプリケーションサーバーで接続プールを設定する必要があります。以下はGlassFishでこれを行う手順です。手順は、使用しているアプリケーションサーバーによって異なります。
JPA構成
次に、上で作成したデータベース接続をJPAエンティティのpersistence.xml
ファイルで次のように参照します。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://Java.Sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/persistence http://Java.Sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="CustomerService" transaction-type="JTA">
<provider>org.Eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>CustomerService</jta-data-source>
<class>org.example.Customer</class>
<class>org.example.Address</class>
<class>org.example.PhoneNumber</class>
<properties>
<property name="eclipselink.target-database" value="Oracle" />
<property name="eclipselink.logging.level" value="FINEST" />
<property name="eclipselink.logging.level.ejb_or_metadata" value="WARNING" />
<property name="eclipselink.logging.timestamp" value="false"/>
<property name="eclipselink.logging.thread" value="false"/>
<property name="eclipselink.logging.session" value="false"/>
<property name="eclipselink.logging.exceptions" value="false"/>
<property name="eclipselink.target-server" value="SunAS9"/>
</properties>
</persistence-unit>
</persistence>
これを見てください link 、それを行う方法の1つを説明するビデオチュートリアルがあります。
したがって、このビデオでは、Webサービスが値を取得して、指定された資格情報がデータベース内の一部のデータと一致することをクライアントに伝える方法を説明しています。
これは、クライアント要求を処理するメソッドがどのように見えるかです:
@POST
@Produces(MediaType.TEXT_PLAIN)
@Path("/login")
public Response login(@FormParam("email") String email, @FormParam("password") String password) {
Response.ResponseBuilder responseBuilder = null;
boolean result = entityFacade.doLogin(email, password);
if (result) {
responseBuilder = Response.ok("Success");//Login good!
}
else {
responseBuilder = Response.ok("Wrong credentials!");//Login bad!
}
return responseBuilder.build();
}
このWebサービスは、EJBがデータベースで選択操作を実行するビジネス層に資格情報を転送します:
@Stateless
public class EntityFacade implements EntityFacadeLocal {
@Resource
private UserTransaction ut;
private CredentialJpaController controller;
@PostConstruct
public void init() {
controller = new CredentialJpaController(ut, Persistence.createEntityManagerFactory("ROLEProject-ejbPU"));
}
public boolean doLogin(String email, String password){
return controller.loginWithParameters(email,password);
}
}
EJBは、データベースと対話するタスクを実行するサービスクラスに依存しています
public class CredentialJpaController implements Serializable {
public CredentialJpaController(UserTransaction utx, EntityManagerFactory emf) {
this.utx = utx;
this.emf = emf;
}
private UserTransaction utx = null;
private EntityManagerFactory emf = null;
public EntityManager getEntityManager() {
return emf.createEntityManager();
}
public boolean loginWithParameters(String email, String password) {
boolean result = false;
EntityManager em = getEntityManager();
Long l = (Long) em.createNamedQuery("loginquery").setParameter("emailParam", email).setParameter("passwordParam", password).getSingleResult();
if (l == 1) {
result = true;
}
return result;
}
}
最後にDBと対話できるようにするには、データをJPAエンティティとして表す必要があります。また、選択された行をマーシャリングしてクライアントに戻すことができるようにするには、MediaTypeが何であれ、エンティティにJaxBアノテーションが含まれている必要があります
@XmlRootElement
@Entity
@Table(name = "CREDENTIALS")
@NamedQuery(name="loginquery", query="SELECT COUNT(c) FROM Credential c WHERE c.email = :emailParam AND c.password = :passwordParam")
public class Credential implements Serializable {
@Id
private String email;
@Column(nullable = false)
private String password;
@XmlElement
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@XmlElement
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
以下はクライアントコードのサンプルです。Webサービスを呼び出す方法の1つを確認できます。
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>TODO supply a title</title>
</head>
<body>
<div>TODO write content</div>
<form action="http://localhost:8080/ROLEProject-war/role/login" method="POST">
Email <input name="email"/>
Password <input type="password" name="password"/>
<input type="submit"/>
</form>
</body>
</html>
これがあなたにアイデアを与えるのに役立つことを願っています。
データを挿入するには、プロセスはほとんど同じです。エンティティマネージャーのfind()ではなく、persist()メソッドを使用します。