该演示演示了分钟项目的轨迹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