zoukankan      html  css  js  c++  java
  • J2EE之wildfly 实践3 --DAS服务开发

    wildfly 实践3 --DAS服务开发,此服务基于JPA对数据进行CURD管理

    IDE Eclipse mars,所在机器 192.168.50.253

      (转载请注明来源:cnblogs coder-fang)

    1. File->new ->maven project ,创建Maven工程,如图:
    2. 修改pom.xml文件:
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
      
          <groupId>com.sanjian.wildfly</groupId>
          <artifactId>ticket-agency-db</artifactId>
          <version>0.1</version>
          <packaging>ejb</packaging>
          <name>ticket-agency-db</name>
          <dependencies>
              <dependency>
                  <groupId>org.jboss.logging</groupId>
                  <artifactId>jboss-logging</artifactId>
                  <version>3.1.4.GA</version>
      
              </dependency>
              <dependency>
                  <groupId>javax</groupId>
                  <artifactId>javaee-api</artifactId>
                  <version>7.0</version>
                  <scope>provided</scope>
              </dependency>
              <dependency>
                  <groupId>com.fasterxml.jackson.core</groupId>
                  <artifactId>jackson-core</artifactId>
                  <version>2.8.1</version>
              </dependency>
              <dependency>
                  <groupId>com.fasterxml.jackson.core</groupId>
                  <artifactId>jackson-annotations</artifactId>
                  <version>2.1.0</version>
              </dependency>
          </dependencies>
          <build>
              <finalName>${project.artifactId}</finalName>
              <plugins>
                  <plugin>
                      <groupId>org.wildfly.plugins</groupId>
                      <artifactId>wildfly-maven-plugin</artifactId>
                      <version>1.0.2.Final</version>
                      <configuration>
                          <filename>${project.build.finalName}.jar</filename>
                          <hostname>192.168.50.123</hostname>
                          <port>8080</port>
                          <username>jboss</username>
                          <password>123</password>
                      </configuration>
                  </plugin>
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-compiler-plugin</artifactId>
                      <version>3.1</version>
                      <configuration>
                          <source>1.8</source>
                          <target>1.8</target>
                      </configuration>
                  </plugin>
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-ejb-plugin</artifactId>
                      <version>2.3</version>
                      <configuration>
                          <ejbVersion>3.2</ejbVersion>
                          <generateClient>false</generateClient>
                      </configuration>
                  </plugin>
              </plugins>
          </build>
      </project>
    3. 在src/main/resources/META-INF下增加两个xml配置文件,如图:
    4. ejb-jar.xml配置如下:
      <?xml version="1.0" encoding="UTF-8"?>
      <ejb-jar xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.2">
        <display-name>ticket-agency-db</display-name>
        <ejb-client-jar>ticket-agency-db.jar</ejb-client-jar>
      </ejb-jar>
    5. persistence.xml配置如下:
      <?xml version="1.0" encoding="UTF-8"?>
      <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
          <persistence-unit name="ticket-agency-db" transaction-type="JTA">
              <jta-data-source>java:/XboMdtDS</jta-data-source>
              <class>com.sanjian.jpa.model.Patient</class>
              <class>com.sanjian.jpa.model.Site</class>
              <properties>
              <property name="hibernate.show_sql" value="true" />
              </properties>
                
          </persistence-unit>
      </persistence>

      注:本例中只对Patient表和Site表进行映射,所以class如上述所示

    6. 创建两个实体类com.sanjian.jpa.model.Patient,com.sanjian.jpa.model.Site.
    7. Patient代码片段如下:
      @Entity
      @Table(name="patient")
      @NamedQuery(name="Patient.findAll", query="SELECT p FROM Patient p")
      public class Patient implements Serializable {
          private static final long serialVersionUID = 1L;
      
          @Id
          @GeneratedValue(strategy=GenerationType.IDENTITY)
          private String id;
      
          @Column(name="pat_birth")
          private String patBirth;
      
          @Column(name="pat_id")
          private String patId;
      
          @Column(name="pat_name")
          private String patName;
      
          @Column(name="pat_sex")
          private String patSex;
      
          @Column(name="pat_weight")
          private String patWeight;
      
          private String version;
      
          //bi-directional many-to-one association to Site
          @ManyToOne
          @JoinColumn(name="created_site")
          private Site site;
      ......setter and getter
    8. Site代码片段如下:
      @Entity
      @Table(name="site")
      @NamedQuery(name="Site.findAll", query="SELECT s FROM Site s")
      public class Site implements Serializable {
          private static final long serialVersionUID = 1L;
      
          @Id
          @GeneratedValue(strategy=GenerationType.IDENTITY)
          private long id;
      
          private int canresetmcode;
      
          private String contact;
      
          private String maccode;
      
          private String offreason;
      
          private String siteaddress;
      ...getter and setter
    9. 右键此工程,执行maven-->update project,排除相关错误。
    10. 创建com.sanjian.jpa.model.dao.AbstractDao,代码如下:
      @TransactionAttribute(TransactionAttributeType.REQUIRED)
      public abstract class AbstractDao<T extends Serializable> implements Serializable {
      
          private final Class<T> clazz;
      
          @PersistenceContext
          private EntityManager em;
      
          public AbstractDao(Class<T> clazz) {
              this.clazz = clazz;
          }
      
          @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)  
          public  long getCount() {  
              return (Long)em.createQuery("select count("+ getCountField() +") from "+ getEntityName()+ " o").getSingleResult();  
          }  
          public void delete(Object entityid) {
              em.remove(em.getReference(clazz, entityid));
          }
      
          public T find(Object entityId) {
              return em.find(clazz, entityId);
          }
          public void save(Object entity) {  
              em.persist(entity);  
          }  
           
          public void update(Object entity) {  
              em.merge(entity);  
          }
          
          @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)  
          public QueryResult<T> getScrollData(  
                  int firstindex, int maxresult, LinkedHashMap<String, String> orderby) {  
              return getScrollData(firstindex,maxresult,null,null,orderby);  
          }  
            
          @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)    
          public QueryResult<T> getScrollData(  
                  int firstindex, int maxresult, String wherejpql, Object[] queryParams) {  
              return getScrollData(firstindex,maxresult,wherejpql,queryParams,null);  
          }  
            
          @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)    
          public QueryResult<T> getScrollData(int firstindex, int maxresult) {  
              return getScrollData(firstindex,maxresult,null,null,null);  
          }  
            
          @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)    
          public QueryResult<T> getScrollData() {  
              return getScrollData(-1, -1);  
          }  
        
          @SuppressWarnings("unchecked")  
          @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)  
          public QueryResult<T> getScrollData(int firstindex, int maxresult  
                  , String wherejpql, Object[] queryParams,LinkedHashMap<String, String> orderby) {  
              QueryResult<T> qr = new QueryResult<T>();  
              String entityname = getEntityName();  
              Query query = em.createQuery("select o from "+ entityname+ " o "+(wherejpql==null? "": "where "+ wherejpql)+ buildOrderby(orderby));  
              setQueryParams(query, queryParams);  
              if(firstindex!=-1 && maxresult!=-1) query.setFirstResult(firstindex).setMaxResults(maxresult);  
              qr.setResultlist(query.getResultList());  
              query = em.createQuery("select count("+ getCountField()+ ") from "+ entityname+ " o "+(wherejpql==null? "": "where "+ wherejpql));  
              setQueryParams(query, queryParams);  
              qr.setTotalrecord((Long)query.getSingleResult());  
              return qr;  
          }  
            
          protected void setQueryParams(Query query, Object[] queryParams){  
              if(queryParams!=null && queryParams.length>0){  
                  for(int i=0; i<queryParams.length; i++){  
                      query.setParameter(i+1, queryParams[i]);  
                  }  
              }  
          }  
          protected String buildOrderby(LinkedHashMap<String, String> orderby){  
              StringBuffer orderbyql = new StringBuffer("");  
              if(orderby!=null && orderby.size()>0){  
                  orderbyql.append(" order by ");  
                  for(String key : orderby.keySet()){  
                      orderbyql.append("o.").append(key).append(" ").append(orderby.get(key)).append(",");  
                  }  
                  orderbyql.deleteCharAt(orderbyql.length()-1);  
              }  
              return orderbyql.toString();  
          }  
         
          protected String getEntityName(){  
              String entityname = clazz.getSimpleName();  
              Entity entity = clazz.getAnnotation(Entity.class);  
              if(entity.name()!=null && !"".equals(entity.name())){  
                  entityname = entity.name();  
              }  
              return entityname;  
          }  
          protected String getCountField(){  
              String out = "o";  
              try {  
                  PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(clazz).getPropertyDescriptors();  
                  for(PropertyDescriptor propertydesc : propertyDescriptors){  
                      Method method = propertydesc.getReadMethod();  
                      if(method!=null && method.isAnnotationPresent(EmbeddedId.class)){                     
                          PropertyDescriptor[] ps = Introspector.getBeanInfo(propertydesc.getPropertyType()).getPropertyDescriptors();  
                          out = "o."+ propertydesc.getName()+ "." + (!ps[1].getName().equals("class")? ps[1].getName(): ps[0].getName());  
                          break;  
                      }  
                  }  
              } catch (Exception e) {  
                  e.printStackTrace();  
              }  
              return out;  
          }  
      }
      View Code
    11. 创建com.sanjian.jpa.model.dao.QueryResult,代码如下:
      public class QueryResult<T> implements Serializable{
      
          /**
           * 
           */
          private static final long serialVersionUID = -4283264692574549712L;
          private List<T> resultlist;
          private Long totalrecord;
      
          /**
           * @return the resultlist
           */
          public List<T> getResultlist() {
              return resultlist;
          }
      
          /**
           * @param resultlist the resultlist to set
           */
          public void setResultlist(List<T> resultlist) {
              this.resultlist = resultlist;
          }
      
          /**
           * @return the totalrecord
           */
          public Long getTotalrecord() {
              return totalrecord;
          }
      
          /**
           * @param totalrecord the totalrecord to set
           */
          public void setTotalrecord(Long totalrecord) {
              this.totalrecord = totalrecord;
          }
      }
      View Code
    12. 创建com.sanjian.jpa.model.dao.SiteDao,代码片段如下:
      @Stateless
      public class SiteDao extends AbstractDao<Site>{
      
          /**
           * 
           */
          private static final long serialVersionUID = 461138635288849346L;
      
          public SiteDao() {
              super(Site.class);
              // TODO Auto-generated constructor stub
          }
      
      }
      View Code

      注:PatientDao代码类似

    13. 右键工程->New->Session Bean:如图:
    14. SiteManager代码如下:
      @Stateless
      @LocalBean
      public class SiteManager implements SiteManagerRemote {
          private static Logger logger = Logger.getLogger(SiteManager.class);
          
          @EJB
          SiteDao siteDao;
          @EJB
          PatientDao patientDao;
          /**
           * Default constructor. 
           */
          public SiteManager() {
              // TODO Auto-generated constructor stub        
          }        
          @Override
          public QueryResult<Site> listSites(int status) {
              
              QueryResult<Site> lst  = null;
              try {
                  
                  lst = siteDao.getScrollData(0, 100, "status=?1", new Object[]{status});
              } catch (Exception e) {
                  // TODO: handle exception
                  e.printStackTrace();
              }
                       
              return lst;
              
          }
          
        
          
          public SiteDao getSiteDao() {
              return siteDao;
          }
      
      
          public void setSiteDao(SiteDao siteDao) {
              this.siteDao = siteDao;
          }
      
      }
      View Code
    15. 修改相关接口代码SiteManagerRemote,代码如下:
      @Remote
      public interface SiteManagerRemote {
          QueryResult<Site> listSites(int status);
          
      }
    16. 至此,EJB服务接口编写完成,使用maven->update project 更新代码并修复错误。
    17. 发布设置,打开Run->run configuration,配置如下:
    18. 确保50.123机器服务已运行,点击上图中的运行,则此ejb即可发布至50.123上,console控制台代码片段如下:
      [INFO] Building EJB ticket-agency-db with EJB version 3.2
      [INFO] Building jar: E:StudyCodeWorkSpace	icket-agency	icket-agency-db	arget	icket-agency-db.jar
      [INFO] 
      [INFO] --- maven-install-plugin:2.4:install (default-install) @ ticket-agency-db ---
      [INFO] Installing E:StudyCodeWorkSpace	icket-agency	icket-agency-db	arget	icket-agency-db.jar to E:mavenrepocomsanjianwildfly	icket-agency-db.1	icket-agency-db-0.1.jar
      [INFO] Installing E:StudyCodeWorkSpace	icket-agency	icket-agency-dbpom.xml to E:mavenrepocomsanjianwildfly	icket-agency-db.1	icket-agency-db-0.1.pom
      [INFO] 
      [INFO] >>> wildfly-maven-plugin:1.0.2.Final:deploy (default-cli) > package @ ticket-agency-db >>>
      [INFO] 
      [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ ticket-agency-db ---
      [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
      [INFO] Copying 2 resources
      [INFO] 
      [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ ticket-agency-db ---
      [INFO] Nothing to compile - all classes are up to date
      [INFO] 
      [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ ticket-agency-db ---
      [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
      [INFO] Copying 0 resource
      [INFO] 
      [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ ticket-agency-db ---
      [INFO] Nothing to compile - all classes are up to date
      [INFO] 
      [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ ticket-agency-db ---
      [INFO] Skipping execution of surefire because it has already been run for this configuration
      [INFO] 
      [INFO] --- maven-ejb-plugin:2.3:ejb (default-ejb) @ ticket-agency-db ---
      [INFO] Building EJB ticket-agency-db with EJB version 3.2
      [INFO] Building jar: E:StudyCodeWorkSpace	icket-agency	icket-agency-db	arget	icket-agency-db.jar
      [INFO] 
      [INFO] <<< wildfly-maven-plugin:1.0.2.Final:deploy (default-cli) < package @ ticket-agency-db <<<
      [INFO] 
      [INFO] --- wildfly-maven-plugin:1.0.2.Final:deploy (default-cli) @ ticket-agency-db ---
      十二月 13, 2016 4:10:16 下午 org.xnio.Xnio <clinit>
      INFO: XNIO version 3.2.2.Final
      十二月 13, 2016 4:10:16 下午 org.xnio.nio.NioXnio <clinit>
      INFO: XNIO NIO Implementation Version 3.2.2.Final
      十二月 13, 2016 4:10:17 下午 org.jboss.remoting3.EndpointImpl <clinit>
      INFO: JBoss Remoting version 4.0.3.Final
      Authenticating against security realm: ManagementRealm
      [INFO] ------------------------------------------------------------------------
      [INFO] BUILD SUCCESS
      [INFO] ------------------------------------------------------------------------
      [INFO] Total time: 7.803 s
      [INFO] Finished at: 2016-12-13T16:10:20+08:00
      [INFO] Final Memory: 25M/206M
      [INFO] ------------------------------------------------------------------------
      View Code
    19. 至此,DAS服务已发布至50.123的机器上,下篇文章,我们使用web服务访问DAS服务。

     

  • 相关阅读:
    仿google的suggest
    renderjs主动发起通讯
    数据库设计原则(转载)
    SqlBulkCopy批量插入
    NPOI使用word模板
    visual studio 2010与NUNIT集成调试
    bond
    linux 内核参数优化
    Linux清除用户登陆及历史命令
    nginx 常用请求
  • 原文地址:https://www.cnblogs.com/coder-fang/p/6170385.html
Copyright © 2011-2022 走看看