在本演示中,我们将使用spring / jpa2后端生成一个REST / CXF应用程序。

该演示演示了分钟项目的轨迹REST-CXF 。

演示2中的模型保持不变。

浓缩保持不变。

但是轨道改变了

添加的是2层:

  • 在JPA2之上具有弹簧集成的DAO层
  • 具有JAX-RS批注的REST-CXF层

JPA2实体由JAXB注释注释。

所有这些都是为了在模型实体的顶部提供CRUD接口。

组态

这是配置TRANXY-JPA2-Spring-REST-CXF.xml

<!DOCTYPE root>
<generator-config xmlns="http://minuteproject.sf.net/xsd/mp-config"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:noNamespaceSchemaLocation="../config/mp-config.xsd"><configuration><conventions><target-convention type="enable-updatable-code-feature" /></conventions><model name="tranxy" version="1.0" package-root="net.sf.mp.demo"><data-model><driver name="mysql" version="5.1.16" groupId="mysql"artifactId="mysql-connector-java"></driver><dataSource><driverClassName>org.gjt.mm.mysql.Driver</driverClassName><url>jdbc:mysql://127.0.0.1:3306/tranxy</url><username>root</username><password>mysql</password></dataSource><primaryKeyPolicy oneGlobal="false" ><primaryKeyPolicyPattern name="autoincrementPattern"></primaryKeyPolicyPattern></primaryKeyPolicy></data-model><business-model><generation-condition><condition type="exclude" startsWith="QUARTZ"></condition></generation-condition><business-package default="tranxy"><condition type="package" startsWith="trans" result="translation"></condition></business-package><enrichment><conventions><!-- manipulate the structure and entities BEFORE manipulating the entities --><column-naming-convention type="apply-strip-column-name-suffix"pattern-to-strip="ID" /><reference-naming-conventiontype="apply-referenced-alias-when-no-ambiguity" is-to-plurialize="true" /></conventions><entity name="language_x_translator"><field name="language_id" linkReferenceAlias="translating_language" /><field name="user_id" linkReferenceAlias="translator" /></entity><entity name="LANGUAGE_X_SPEAKER"><field name="LANGUAGE_ID" linkToTargetEntity="LANGUAGE"linkToTargetField="IDLANGUAGE" linkReferenceAlias="spoken_language" /><field name="user_id" linkReferenceAlias="speaker" /></entity><entity name="APPLICATION"><field name="TYPE"><property tag="checkconstraint" alias="application_type"><property name="OPENSOURCE"/><property name="COPYRIGHT" /></property></field></entity></enrichment></business-model></model><targets><target refname="REST-CXF-BSLA" name="default" fileName="mp-template-config-REST-CXF-Spring.xml" outputdir-root="../../DEV/latvianjug/tranxy/rest"templatedir-root="../../template/framework/cxf"></target><target refname="BackendOnBsla" name="default" fileName="mp-template-config-JPA2-bsla.xml" outputdir-root="../../DEV/latvianjug/tranxy/bsla"templatedir-root="../../template/framework/bsla"><property name="add-cache-implementation" value="ehcache"></property></target> <target refname="JPA2" fileName="mp-template-config-JPA2.xml"outputdir-root="../../DEV/latvianjug/tranxy/jpa" templatedir-root="../../template/framework/jpa"><property name="add-querydsl" value="2.1.2"></property><property name="add-jpa2-implementation" value="hibernate"></property><property name="add-cache-implementation" value="ehcache"></property><property name="add-domain-specific-method" value="true"></property><property name="add-xmlbinding" value="true"></property> <property name="add-xml-format" value="lowercase-hyphen"></property> </target><target refname="MavenMaster" name="maven" fileName="mp-template-config-maven.xml" outputdir-root="../../DEV/latvianjug/tranxy"templatedir-root="../../template/framework/maven"></target><target refname="CACHE-LIB" fileName="mp-template-config-CACHE-LIB.xml"templatedir-root="../../template/framework/cache"></target><target refname="LIB" fileName="mp-template-config-bsla-LIB-features.xml"templatedir-root="../../template/framework/bsla">
</target><target refname="REST-LIB" fileName="mp-template-config-REST-LIB.xml" templatedir-root="../../template/framework/rest"></target><target refname="SPRING-LIB" fileName="mp-template-config-SPRING-LIB.xml" templatedir-root="../../template/framework/spring"></target></targets></configuration>
</generator-config>

待办事项说明

在/ mywork / config中设置TRANXY-JPA2-Spring-REST-CXF.xml

> model-generation.cmd TRANXY-JPA2-Spring-REST-CXF.xml 输出进入/ dev / latvianjug / tranxy

产生的伪像

具有3个模块的Maven项目结构

  • JPA2层
  • Spring DAO层
  • CXF层

在演示1和演示2中已经访问了JPA2层。

Spring DAO层

它由每个实体一个的交易服务组成

JPA2之上的CRUD DAO层:该层称为BSLA(基本Spring层体系结构)。

每个实体都会生成两个接口和实现
翻译实体示例

DAO接口

/*** Copyright (c) minuteproject, minuteproject@gmail.com* All rights reserved.* * Licensed under the Apache License, Version 2.0 (the "License")* you may not use this file except in compliance with the License.* You may obtain a copy of the License at* * http://www.apache.org/licenses/LICENSE-2.0* * Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.* * More information on minuteproject:* twitter @minuteproject* wiki http://minuteproject.wikispaces.com * blog http://minuteproject.blogspot.net*
*/
/*** template reference : * - name : BslaDaoInterfaceUML* - file name : BslaDaoInterfaceUML.vm
*/
package net.sf.mp.demo.tranxy.dao.face.translation;import net.sf.mp.demo.tranxy.domain.translation.Translation;
import java.util.List;
import net.sf.minuteProject.architecture.bsla.bean.criteria.PaginationCriteria;
import net.sf.minuteProject.architecture.bsla.dao.face.DataAccessObject;/**** <p>Title: TranslationDao</p>** <p>Description: Interface of a Data access object dealing with TranslationDao* persistence. It offers a set of methods which allow for saving,* deleting and searching translation objects</p>**/
public interface TranslationDao extends DataAccessObject {/*** Inserts a Translation entity * @param Translation translation*/public void insertTranslation(Translation translation) ;/*** Inserts a list of Translation entity * @param List<Translation> translations*/public void insertTranslations(List<Translation> translations) ;/*** Updates a Translation entity * @param Translation translation*/public Translation updateTranslation(Translation translation) ;/*** Updates a Translation entity with only the attributes set into Translation.* The primary keys are to be set for this method to operate.* This is a performance friendly feature, which remove the udibiquous full load and full update when an* update is to be done* Remark: The primary keys cannot be update by this methods, nor are the attributes that must be set to null.* @param Translation translation*/public int updateNotNullOnlyTranslation(Translation translation) ;public int updateNotNullOnlyPrototypeTranslation(Translation translation, Translation prototypeCriteria);/*** Saves a Translation entity * @param Translation translation*/public void saveTranslation(Translation translation);/*** Deletes a Translation entity * @param Translation translation*/public void deleteTranslation(Translation translation) ;/*** Loads the Translation entity which is related to an instance of* Translation* @param Long id* @return Translation The Translation entitypublic Translation loadTranslation(Long id);
*//*** Loads the Translation entity which is related to an instance of* Translation* @param java.lang.Long Id* @return Translation The Translation entity*/public Translation loadTranslation(java.lang.Long id);    /*** Loads a list of Translation entity * @param List<java.lang.Long> ids* @return List<Translation> The Translation entity*/public List<Translation> loadTranslationListByTranslation (List<Translation> translations);/*** Loads a list of Translation entity * @param List<java.lang.Long> ids* @return List<Translation> The Translation entity*/public List<Translation> loadTranslationListById(List<java.lang.Long> ids);/*** Loads the Translation entity which is related to an instance of* Translation and its dependent one to many objects* @param Long id* @return Translation The Translation entity*/public Translation loadFullFirstLevelTranslation(java.lang.Long id);/*** Loads the Translation entity which is related to an instance of* Translation* @param Translation translation* @return Translation The Translation entity*/public Translation loadFullFirstLevelTranslation(Translation translation);    /*** Loads the Translation entity which is related to an instance of* Translation and its dependent objects one to many* @param Long id* @return Translation The Translation entity*/public Translation loadFullTranslation(Long id) ;/*** Searches a list of Translation entity based on a Translation containing Translation matching criteria* @param Translation translation* @return List<Translation>*/public List<Translation> searchPrototypeTranslation(Translation translation) ;/*** Searches a list of Translation entity based on a list of Translation containing Translation matching criteria* @param List<Translation> translations* @return List<Translation>*/public List<Translation> searchPrototypeTranslation(List<Translation> translations) ;    /*** Searches a list of Translation entity * @param Translation translation* @return List*/public List<Translation> searchPrototypeTranslation(Translation translationPositive, Translation translationNegative) ;/*** Load a paginated list of Translation entity dependent of pagination criteria* @param PaginationCriteria paginationCriteria* @return List*/public List<Translation> loadPaginatedTranslation (Translation translation, PaginationCriteria paginationCriteria) ;}
/*** Copyright (c) minuteproject, minuteproject@gmail.com* All rights reserved.* * Licensed under the Apache License, Version 2.0 (the "License")* you may not use this file except in compliance with the License.* You may obtain a copy of the License at* * http://www.apache.org/licenses/LICENSE-2.0* * Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.* * More information on minuteproject:* twitter @minuteproject* wiki http://minuteproject.wikispaces.com * blog http://minuteproject.blogspot.net*
*/
/*** template reference : * - name : BslaDaoInterfaceExtendedUML* - file name : BslaDaoInterfaceKFUML.vm
*/
package net.sf.mp.demo.tranxy.dao.face.translation;import net.sf.mp.demo.tranxy.domain.translation.Translation;
import java.util.List;
import net.sf.minuteProject.architecture.filter.data.Criteria;
import net.sf.minuteProject.architecture.bsla.dao.face.DataAccessObject;/**** <p>Title: TranslationExtDao</p>** <p>Description: Interface of a Data access object dealing with TranslationExtDao* persistence. It offers extended DAO functionalities</p>**/
public interface TranslationExtDao extends DataAccessObject {/*** Inserts a Translation entity with cascade of its children* @param Translation translation*/public void insertTranslationWithCascade(Translation translation) ;/*** Inserts a list of Translation entity with cascade of its children* @param List<Translation> translations*/public void insertTranslationsWithCascade(List<Translation> translations) ;        /*** lookup Translation entity Translation, criteria and max result number*/public List<Translation> lookupTranslation(Translation translation, Criteria criteria, Integer numberOfResult);public Integer updateNotNullOnlyTranslation (Translation translation, Criteria criteria);/*** Affect the first translation retrieved corresponding to the translation criteria.* Blank criteria are mapped to null.* If no criteria is found, null is returned.*/public Translation affectTranslation (Translation translation);public Translation affectTranslationUseCache (Translation translation);/*** Assign the first translation retrieved corresponding to the translation criteria.* Blank criteria are mapped to null.* If no criteria is found, null is returned.* If there is no translation corresponding in the database. Then translation is inserted and returned with its primary key(s). */public Translation assignTranslation (Translation translation);/*** Assign the first translation retrieved corresponding to the mask criteria.* Blank criteria are mapped to null.* If no criteria is found, null is returned.* If there is no translation corresponding in the database. * Then translation is inserted and returned with its primary key(s). * Mask servers usually to set unique keys or the semantic reference*/public Translation assignTranslation (Translation translation, Translation mask);public Translation assignTranslationUseCache (Translation translation);/*** return the first Translation entity found*/           public Translation getFirstTranslation (Translation translation);/*** checks if the Translation entity exists*/           public boolean existsTranslation (Translation translation);    public boolean existsTranslationWhereConditionsAre (Translation translation);/*** partial load enables to specify the fields you want to load explicitly*/            public List<Translation> partialLoadTranslation(Translation translation, Translation positiveTranslation, Translation negativeTranslation);/*** partial load with parent entities* variation (list, first, distinct decorator)* variation2 (with cache)*/public List<Translation> partialLoadWithParentTranslation(Translation translation, Translation positiveTranslation, Translation negativeTranslation);public List<Translation> partialLoadWithParentTranslationUseCache(Translation translation, Translation positiveTranslation, Translation negativeTranslation, Boolean useCache);public List<Translation> partialLoadWithParentTranslationUseCacheOnResult(Translation translation, Translation positiveTranslation, Translation negativeTranslation, Boolean useCache);/*** variation first*/public Translation partialLoadWithParentFirstTranslation(Translation translationWhat, Translation positiveTranslation, Translation negativeTranslation);public Translation partialLoadWithParentFirstTranslationUseCache(Translation translationWhat, Translation positiveTranslation, Translation negativeTranslation, Boolean useCache);public Translation partialLoadWithParentFirstTranslationUseCacheOnResult(Translation translationWhat, Translation positiveTranslation, Translation negativeTranslation, Boolean useCache);/*** variation distinct*/public List<Translation> getDistinctTranslation(Translation translationWhat, Translation positiveTranslation, Translation negativeTranslation);//public List partialLoadWithParentForBean(Object bean, Translation translation, Translation positiveTranslation, Translation negativeTranslation);/*** search on prototype with cache*/public List<Translation> searchPrototypeWithCacheTranslation (Translation translation);/*** Searches a list of distinct Translation entity based on a Translation mask and a list of Translation containing Translation matching criteria* @param Translation translation* @param List<Translation> translations* @return List<Translation>*/public List<Translation> searchDistinctPrototypeTranslation(Translation translationMask, List<Translation> translations) ;    public List<Translation> countDistinct (Translation whatMask, Translation whereEqCriteria);public Long count (Translation whereEqCriteria);public List<Translation> loadGraph(Translation graphMaskWhat, List<Translation> whereMask);  public List<Translation> loadGraphFromParentKey (Translation graphMaskWhat, List<Translation> parents); /*** generic to move after in superclass*/public List<Object[]> getSQLQueryResult(String query);     }

DAO实施

TranslationJPAImpl和TranslationJPAExtImpl(未复制代码)。

将来,通用​​DAO将用于跨实体冗余方面。
将执行对spring 3.x的适应(即,不再通过EntityManager注入进行JPASupport扩展)
同时,上面的代码在spring 2.5+上可以正常工作

弹簧配置

spring-config-Tranxy-BE-main.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans><!-- Dao JPA --><import resource="classpath:net/sf/mp/demo/tranxy/factory/spring/spring-config-JPA-Tranxy-dao.xml"/>    <!--MP-MANAGED-UPDATABLE-BEGINNING-DISABLE @JPAtranxyFactory-tranxy@--><!-- hibernate config to put in an appart config file--><bean id="JPAtranxyFactory" autowire="byName"class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><!-- all connection information are retrieve from the persistence file--><!--<property name="dataSource" ref="..."/><property name="persistenceUnitName" value="..."/>--><property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" /></bean>
<!--MP-MANAGED-UPDATABLE-ENDING--><!-- Database --><import resource="classpath:net/sf/mp/demo/tranxy/factory/spring/spring-config-Tranxy-database.xml"/>    </beans>

spring-config-Tranxy-database.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jndi="http://www.springframework.org/schema/jee"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"><bean id="placeHolderConfig"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="location"><value>classpath:net/sf/mp/demo/tranxy/factory/spring/spring-config-Tranxy.properties</value></property></bean>     <bean id="tranxyTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="JPAtranxyFactory"/></bean><!-- to get the entity manager --><tx:annotation-driven transaction-manager="tranxyTransactionManager"/></beans>

spring-config-Tranxy-BE-main

jdbc.tranxy.driverClassName=org.gjt.mm.mysql.Driver
jdbc.tranxy.url=jdbc:mysql://127.0.0.1:3306/tranxy
jdbc.tranxy.username=root
jdbc.tranxy.password=mysql
jdbc.tranxy.jndi=jdbc/tranxy
hibernate.dialect=org.hibernate.dialect.MySQLDialect

spring-config-JPA-Tranxy-dao.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans><!-- Import Dao definitions for business components --><!-- tranxy --><import resource="classpath:net/sf/mp/demo/tranxy/factory/spring/tranxy/dao-JPA-Tranxy.xml"/><!-- translation --><import resource="classpath:net/sf/mp/demo/tranxy/factory/spring/translation/dao-JPA-Translation.xml"/><!-- Import Ext Dao definitions for business components --><!-- tranxy extended dao --><import resource="classpath:net/sf/mp/demo/tranxy/factory/spring/tranxy/dao-ext-JPA-Tranxy.xml"/><!-- translation extended dao --><import resource="classpath:net/sf/mp/demo/tranxy/factory/spring/translation/dao-ext-JPA-Translation.xml"/></beans>

dao-JPA-Translation.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans><bean id="translationDao" class="net.sf.mp.demo.tranxy.dao.impl.jpa.translation.TranslationJPAImpl" singleton="false" ><property name="entityManagerFactory"><ref bean="JPAtranxyFactory"/></property></bean><bean id="translationKeyDao" class="net.sf.mp.demo.tranxy.dao.impl.jpa.translation.TranslationKeyJPAImpl" singleton="false" ><property name="entityManagerFactory"><ref bean="JPAtranxyFactory"/></property></bean><bean id="translationRequestDao" class="net.sf.mp.demo.tranxy.dao.impl.jpa.translation.TranslationRequestJPAImpl" singleton="false" ><property name="entityManagerFactory"><ref bean="JPAtranxyFactory"/></property></bean></beans>

dao-ext-JPA-Translation.xml,dao-ext-JPA-Tranxy.xml,dao-JPA-Tranxy.xml文件相同

但是请稍等...如何进行单元测试?

在编写自己的测试之前,您还需要另外两个工件。

一个是persistence.xml

再次? 是的,对于嵌入式连接池,因为JPA2层的构建随附提供的引用可能是JNDI数据源(如果将属性环境设置为远程)。
由于它位于/ src / test / resources / META-INF下,因此它将覆盖JPA2软件包中的那个。

二是扩展AbstractTransactionalJUnit4SpringContextTests 的适配器 :它在/ src / test / java中生成

package net.sf.mp.demo.tranxy.dao.face;import javax.sql.DataSource;import org.apache.commons.lang.StringUtils;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:net/sf/mp/demo/tranxy/factory/spring/spring-config-Tranxy-BE-main.xml"
})
@TransactionConfiguration(transactionManager = "tranxyTransactionManager")
@Transactional
public class AdapterTranxyTestDao extends AbstractTransactionalJUnit4SpringContextTests { @Override@Autowiredpublic void setDataSource(@Qualifier(value = "tranxyDataSource") DataSource dataSource) {this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);}
...

CXF

每个实体都有一个带有JAX-RS批注的Rest Resource工件,以启用CRUD访问。 翻译示例

/*** Copyright (c) minuteproject, minuteproject@gmail.com* All rights reserved.* * Licensed under the Apache License, Version 2.0 (the "License")* you may not use this file except in compliance with the License.* You may obtain a copy of the License at* * http://www.apache.org/licenses/LICENSE-2.0* * Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.* * More information on minuteproject:* twitter @minuteproject* wiki http://minuteproject.wikispaces.com * blog http://minuteproject.blogspot.net*
*/
/*** template reference : * - name : CXFSpringEntityResource* - file name : CXFSpringEntityResource.vm
*/
package net.sf.mp.demo.tranxy.rest.translation;import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import java.io.*;
import java.sql.*;import javax.servlet.http.*;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.FormParam;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import javax.xml.bind.JAXBElement;import net.sf.mp.demo.tranxy.dao.face.translation.TranslationDao;
import net.sf.mp.demo.tranxy.dao.face.translation.TranslationExtDao;
import net.sf.mp.demo.tranxy.domain.translation.Translation;/**** <p>Title: TranslationResource</p>** <p>Description: remote interface for TranslationResource service </p>**/
@Path ("/rest/xml/translations")
@Produces ({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Consumes ({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Service
@Transactional
public class TranslationResource  {@Autowired@Qualifier("translationDao")TranslationDao translationDao;@Autowired@Qualifier("translationExtDao")TranslationExtDao translationExtDao;//MP-MANAGED-UPDATABLE-BEGINNING-DISABLE @FIND_ALL-translation@@GET@Produces ({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public List<Translation> findAll () {List<Translation> r = new ArrayList<Translation>();List<Translation> l = translationDao.searchPrototypeTranslation(new Translation());for (Translation translation : l) {r.add(translation.flat());}return r;}
//MP-MANAGED-UPDATABLE-ENDING//MP-MANAGED-UPDATABLE-BEGINNING-DISABLE @FIND_BY_ID-translation@@GET@Path("{id}")@Produces ({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})  public Translation findById (@PathParam ("id") java.lang.Long id) {Translation _translation = new Translation ();_translation.setId(id);_translation = translationExtDao.getFirstTranslation(_translation);if (_translation!=null) return _translation.flat();return new Translation ();}
//MP-MANAGED-UPDATABLE-ENDING@DELETE@Path("{id}")public void delete (@PathParam ("id") Long id) {Translation translation = new Translation ();translation.setId(id);translationDao.deleteTranslation(translation);}@POST@Produces ({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Consumes(MediaType.APPLICATION_FORM_URLENCODED)public Translation create (@FormParam("id") Long id,@FormParam("translation") String translation,@FormParam("language") Integer language,@FormParam("key") Long key,@FormParam("isFinal") Short isFinal,@FormParam("dateFinalization") Date dateFinalization,@FormParam("translator") Long translator,@Context HttpServletResponse servletResponse) throws IOException {Translation _translation = new Translation (id,translation,language,key,isFinal,dateFinalization,translator);return save(_translation);}@PUT@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})public Translation save(JAXBElement<Translation> jaxbTranslation) {Translation translation = jaxbTranslation.getValue();if (translation.getId()!=null)return translationDao.updateTranslation(translation);return save(translation);}public Translation save (Translation translation) {translationDao.saveTranslation(translation);return translation;}}

Web应用程序和Spring的两个文件位于/ src / main / resources / webapp / WEB-INF

Web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><display-name>tranxy CXF REST</display-name><description>tranxy CXF REST access</description><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/application-context.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><servlet><servlet-name>CXFServlet</servlet-name><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>CXFServlet</servlet-name><url-pattern>/*</url-pattern></servlet-mapping></web-app>

application-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:jaxrs="http://cxf.apache.org/jaxrs"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://cxf.apache.org/jaxrshttp://cxf.apache.org/schemas/jaxrs.xsd"><import resource="classpath:META-INF/cxf/cxf.xml" /><import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml" /><import resource="classpath:META-INF/cxf/cxf-servlet.xml" /><context:component-scan base-package="net.sf.mp.demo.tranxy.rest"/><import resource="classpath:net/sf/mp/demo/tranxy/factory/spring/spring-config-Tranxy-BE-main.xml"/>    <jaxrs:server id="restContainer" address="/"><jaxrs:serviceBeans><!-- tranxy --> <ref bean="applicationResource"/><ref bean="languageResource"/><ref bean="userResource"/><!-- translation --> <ref bean="translationResource"/><ref bean="translationKeyResource"/><ref bean="translationRequestResource"/><!-- statements --></jaxrs:serviceBeans></jaxrs:server> </beans>

打包,部署和测试


在生成软件包之前,minuteproject mp-bsla.xyjar附带了一个依赖项以进行安装。 在/ target / mp-bsla /运行脚本中:maven-install.cmd / sh 构建:> MVN清洁包

结果是/ rest / target中的tranxyRestCxfApp.war

部署方式
启动tomcat
将tranxyRestCxfApp.war放到/ webapps中 有一个嵌入式连接池,因此不需要在tomcat上进行任何配置。

测试

USE `tranxy` ;
DELETE FROM application_x_key;
DELETE FROM translation;
DELETE FROM language_x_translator;
DELETE FROM language_x_speaker;
DELETE FROM request_key;DELETE FROM application;
DELETE FROM translation_key;
DELETE FROM user;
DELETE FROM language;INSERT INTO application (idapplication,  name, description, type) VALUES (-1,'Porphyry', 'OS application holding environment app', 'OPENSOURCE');
INSERT INTO application (idapplication,  name, description, type) VALUES (-2,'Minuteproject', 'Minuteproject app', 'OPENSOURCE');INSERT INTO user (iduser, first_name, last_name, email) VALUES (-1,'test', 'lastName', 'test@test.me');
INSERT INTO user (iduser, first_name, last_name, email) VALUES (-2,'test2', 'lastName2', 'test2@test.me');INSERT INTO language (idlanguage, code, description, locale) VALUES (-1, 'FR', 'France', 'fr');
INSERT INTO language (idlanguage, code, description, locale) VALUES (-2, 'ES', 'Spanish', 'es');
INSERT INTO language (idlanguage, code, description, locale) VALUES (-3, 'EN', 'English', 'en');          INSERT INTO language_x_translator (language_id, user_id) VALUES (-1, -1);
INSERT INTO language_x_translator (language_id, user_id) VALUES (-2, -1);
INSERT INTO language_x_speaker (language_id, user_id) VALUES (-1, -1);
INSERT INTO language_x_speaker (language_id, user_id) VALUES (-2, -1);INSERT INTO language_x_translator (language_id, user_id) VALUES (-1, -2);
INSERT INTO language_x_translator (language_id, user_id) VALUES (-2, -2);
INSERT INTO language_x_translator (language_id, user_id) VALUES (-3, -2);    INSERT INTO translation_key (id, key_name, description) VALUES (-1, 'msg.user.name', 'user name');
INSERT INTO translation (id, translation, language_id, key_id, is_final, date_finalization, translator_id)
VALUES (-1, 'nom', -1, -1, 1, '2012-04-04', -1);
INSERT INTO translation (id, translation, language_id, key_id, is_final, date_finalization, translator_id)
VALUES (-2, 'apellido', -1, -2, 1, CURDATE(), -1);

现在输入
http:// localhost:8080 / tranxyRestCxfApp / rest / xml / languages以获取所有语言

这是结果

现在输入
http:// localhost:8080 / tranxyRestCxfApp / rest / xml / users / -1获取第一个用户

这是结果

结论

本文介绍了如何在数据库模型之上快速获取CRUD REST接口。 当然,您可能不需要对所有实体都使用CRUD,并且可能需要更多的粗粒度函数来操纵模型。 下一篇文章将向您展示语句驱动开发如何使我们更接近用例。

参考: RigaJUG –演示–来自JCG合作伙伴 Florian Adler的REST CXF ,位于minuteproject博客博客上。

翻译自: https://www.javacodegeeks.com/2012/05/rest-cxf-for-spring-jpa2-backend.html

用于Spring JPA2后端的REST CXF相关推荐

  1. jax-ws cxf_走向REST:在Spring和JAX-RS(Apache CXF)中嵌入Jetty

    jax-ws cxf 对于服务器核心Java开发人员来说,向世界"展示"的唯一方法是使用API​​. 今天的帖子都是关于JAX-RS的 :使用Java编写和公开RESTful服务. ...

  2. 走向REST:在Spring和JAX-RS(Apache CXF)中嵌入Jetty

    对于服务器核心Java开发人员而言,向世界"展示"的唯一方法是使用API​​. 今天的帖子都是关于JAX-RS的 :使用Java编写和公开RESTful服务. 但是,我们不会使用涉 ...

  3. vue和小程序哪个好学一点_litemall,Spring Boot后端,微信小程序用户前端 + Vue用户移动端...

    litemall 又一个小商场系统. litemall = Spring Boot后端 + Vue管理员前端 + 微信小程序用户前端 + Vue用户移动端 注意: 由于第一次加载数据量较大,建议wif ...

  4. 超优 Vue+Element+Spring 中后端解决方案

    今日推荐 推荐一款开源 Java 版的视频管理系统 推荐3个快速开发平台 前后端都有 项目经验又有着落了 14个项目 转载:toutiao.com/i6911704074815767048 作者:we ...

  5. gradle spring_用于Spring应用程序的Gradle原型

    gradle spring 我发布了Gradle原型,可用于基于Springframework创建Java / Groovy应用程序. 当然,它不是一个真正的原型,因为这样的创作是不可能的 .不过,你 ...

  6. 用于Spring应用程序的Gradle原型

    我发布了Gradle原型,可用于基于Springframework创建Java / Groovy应用程序. 当然,它不是一个真正的原型,因为这样的创作是不可能的 .不过,你可以创建,编辑和部署应用服务 ...

  7. Netflix 开源用于 Spring Boot的 GraphQL 服务框架DGS

    作者 | Netflix 技术博客,策划 | 田晓旭 文章来源:架构头条 Netflix 公司着力开发的 Domain Graph Service(DGS)框架现已正式成为开源项目.DGS 框架简化了 ...

  8. spring mvc后端代码实现弹出对话框_Spring(3)——事务管理和MVC

    事务管理: 使用AspectJ的AOP配置管理事务 <?xml version="1.0" encoding="UTF-8"?> <beans ...

  9. spring mvc后端代码实现弹出对话框_伟源|一图搞定Spring框架

    很多朋友都问济宏同学,现在流行的Java到底是什么鬼?如何快速入门,快速上手? 济宏同学也在网上找了很多文章,但是没有一个文章能说得清楚.所以,济宏同学只好通过脑图方式,给小白们给一个Java现在最流 ...

最新文章

  1. 1102: 火车票退票费计算(函数专题)
  2. Java数据库连接池知识汇总(C3P0+DBCP+Druid)
  3. ie bug(如果不足,留言大家一起分享)
  4. pythonappend用法_python中append实例用法总结
  5. 关于TableView中图片的延时加载(转)
  6. shell脚本while read line的使用
  7. 怎么将oracle的sql文件转换成mysql的sql文件
  8. zabbix 系统IO监控_自动发现
  9. 项目管理:CocoaPods建立私有仓库
  10. 12.docker inspect
  11. 骑士CMS01 74cms v4.2.111 后台getshell漏洞复现
  12. Microsoft edge升级之后收藏夹内容丢失_等了这么久,Edge 终于成为我的默认浏览器...
  13. 采访了 10 位身价过亿的 CEO,我终于看懂了有钱人的“奋斗”
  14. 爬取电影天堂的最新电影
  15. 第一章 Java性能调优概述
  16. 2020年国家扶贫日“三产联动扶贫论坛”在京召开,杭州复杂美科技有限公
  17. vue-i18n的入门使用
  18. Android微信App 分享功能调整,Android 微信SDK分享功能(1)
  19. 力学专业做cae需要学c语言吗,CAE工程师是需要掌握力学知识到何种程度_
  20. 谷歌升级商业搜索软件

热门文章

  1. Flex布局 让你的布局更完美
  2. Get和Post请求和对应的参数获取
  3. spring react_使用Spring WebFlux构建React性REST API –第3部分
  4. java中无法推断类型参数_Java 10中的本地类型推断,或者如果它像鸭子一样嘎嘎叫...
  5. javafx 调用java_Java“地铁”表(JavaFX)
  6. hibernate jpa_使用Hibernate(JPA)一键式删除
  7. java8 函数式编程_如何使用Java 8函数式编程生成字母序列
  8. servlet异步_关于Servlet和异步Servlet
  9. Tycoon:针对多种平台上的Java JIMAGE的勒索软件
  10. Java中的命令设计模式