构建Spring服务以支持Flex应用
立即解锁
发布时间: 2025-08-19 01:52:23 阅读量: 10 订阅数: 16 


Flex与Spring构建RIA企业级应用
### 构建Spring服务以支持Flex应用
#### 1. 架构概述
在为AF – Client Manager应用构建后端服务时,采用了Spring框架与Hibernate结合的方式,以持久化MySQL数据库。整个系统采用典型的三层架构,从Flex前端到MySQL数据库,各层分工明确。
- **af_Central项目**:作为核心,它是一个集中的数据服务组合,包含可重用的服务,运行在BlazeDS服务器中,主要负责整个系统的数据输入和输出。
- **BlazeDS服务器**:运行在Tomcat容器内,包含所有Spring组件,并加载Spring应用上下文以正确连接Spring Bean。通过Spring BlazeDS Integration (SBI),Flex可以对Spring进行RemoteObject调用。
- **Spring Security**:与af_Central应用中的安全对象结合,控制对系统的访问。只有输入有效凭证的用户才能获得访问权限,同时它还能保护Spring Bean中的方法。
|服务名称|描述|
| ---- | ---- |
|secService|管理来自Flex应用的认证和授权调用,返回不包含用户密码的userProfile域对象|
|clientService|包含Client、ClientContacts和ClientLinks对象的方法,Client对象是关系模型的核心|
|invoiceService|处理发票和发票详情|
|mediaService|通过存储服务器文件系统上文件的指针来处理所有媒体|
|projectService|管理对项目的访问,控制与单个客户项目相关的项目风险和项目任务|
#### 2. 配置Spring BlazeDS集成
要让Flex访问Spring服务,需要配置BlazeDS服务器以使用SBI。具体步骤可参考相关文档。
#### 3. 领域对象的创建
领域对象是Spring架构的基础组件,用Java编写,用于存储在Spring各层之间共享的信息。在af_Central应用中,这些对象通过Hibernate的查询结果进行填充,并在Flex中作为值对象进行复制。
需要定义以下领域对象来支持Spring服务:
- Client.java
- ClientContacts.java
- ClientLinks.java
- InvoiceDetails.java
- Invoices.java
- Issues.java
- Media.java
- ProjectRisks.java
- Projects.java
- ProjectTasks.java
这些领域对象位于com.af.core.domain包中,Java类使用注解来让Hibernate将数据库表结果正确映射到领域对象。例如,Client.java的代码如下:
```java
package com.af.core.domain;
import javax.persistence.*;
@Entity
@Table(name="AFCM_CLIENT")
public class Client implements java.io.Serializable
{
static final long serialVersionUID = 1L;
@Id
@Column(name="OBJECTIDENTIFIER")
private long objectIdentifier;
@Column(name="ASSOCOBJECTID")
private long assocobjectID;
@Column(name="CLIENTNAME")
private String clientName;
@Column(name="LINK")
private String link;
@Column(name="DESCRIPTION")
private String description;
@Column(name="NOTES")
private String notes;
@Column(name="PHONE")
private String phone;
@Column(name="ADDRESSLINE1")
private String addressLine1;
@Column(name="ADDRESSLINE2")
private String addressLine2;
@Column(name="CITY")
private String city;
@Column(name="STATE")
private String state;
@Column(name="ZIPCODE")
private int zipCode;
public Client() {}
public long getObjectIdentifier() {
return objectIdentifier;
}
public void setObjectIdentifier(long objectIdentifier) {
this.objectIdentifier = objectIdentifier;
}
public long getAssocobjectID() {
return assocobjectID;
}
public void setAssocobjectID(long assocobjectID) {
this.assocobjectID = assocobjectID;
}
public String getClientName() {
return clientName;
}
public void setClientName(String clientName) {
this.clientName = clientName;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddressLine1() {
return addressLine1;
}
public void setAddressLine1(String addressLine1) {
this.addressLine1 = addressLine1;
}
public String getAddressLine2() {
return addressLine2;
}
public void setAddressLine2(String addressLine2) {
this.addressLine2 = addressLine2;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public int getZip() {
return zipCode;
}
public void setZip(int zipCode) {
this.zipCode = zipCode;
}
}
```
#### 4. Spring服务层
Spring服务层通过SBI的Spring管理的MessageBrokerFactoryBean类向Flex公开,在应用上下文中进行连接。服务层的每个组件都包含一个接口和一个实现Spring Bean的类。
我们将服务进行逻辑分组,创建了客户端、发票、媒体和项目服务,这些服务位于com.af.core.services包中。
- **客户端服务**:包含Client、ClientContacts和ClientLinks对象的方法,接口代码如下:
```java
package com.af.core.services;
import com.af.core.domain.Client;
import com.af.core.domain.ClientContacts;
import com.af.core.domain.ClientLinks;
import java.util.List;
public interface ClientService
{
// Clients
List<Client> getClients();
void insertClient(Client client);
void deleteClient(Client client);
void updateClient(Client client);
// Client Contacts
List<ClientContacts> getClientContacts();
void insertClientContact(ClientContacts clientContact);
void deleteClientContact(ClientContacts clientContact);
void updateClientContact(ClientContacts clientContact);
// Client Links
List<ClientLinks> getClientLinks();
void insertClientLink(ClientLinks clientLink);
void deleteClientLink(ClientLinks clientLink);
void updateClientLink(ClientLinks clientLink);
}
```
实现类代码如下:
```java
package com.af.core.services;
import com.af.core.dao.ClientDao;
import com.af.core.domain.Client;
import com.af.core.domain.ClientContacts;
import com.af.core.domain.ClientLinks;
import java.util.List;
import java.io.Serializable;
public class ClientServiceImpl implements Serializable, ClientService
{
// injected by Spring
ClientDao clientDao;
public ClientDao getClientDao() {
return clientDao;
}
public void setClientDao(ClientDao clientDao) {
this.clientDao = clientDao;
}
// Clients
public List<Client> getClients() {
return clientDao.getClients();
}
public void insertClient(Client client) {
clientDao.insertClient(client);
}
public void deleteClient(Client client) {
clientDao.deleteClient(client);
}
public void updateClient(Client client) {
clientDao.updateClient(client);
}
// ClientContacts
public List<ClientContacts> getClientContacts() {
return clientDao.getClientContacts();
}
public void insertClientContact(ClientContacts clientContact) {
clientDao.insertClientContact(clientContact);
}
public void deleteClientContact(ClientContacts clientContact) {
clientDao.deleteClientContact(clientContact);
}
public void updateClientContact(ClientContacts clientContact) {
clientDao.updateClientContact(clientContact);
}
// ClientLinks
public List<ClientLinks> getClientLinks() {
return clientDao.getClientLinks();
}
public void insertClientLink(ClientLinks clientLinks) {
clientDao.insertClientLink(clientLinks);
}
public void deleteClientLink(ClientLinks clientLinks) {
clientDao.deleteClientLink(clientLinks);
}
public void updateClientLink(ClientLinks clientLinks) {
clientDao.updateClientLink(clientLinks);
}
}
```
- **发票服务**:处理发票和发票详情,用于在AF – Client Manager仪表板组件上绘制客户销售进度图表。接口代码如下:
```java
package com.af.core.services;
import java.util.List;
import com.af.core.domain.InvoiceDetails;
import com.af.core.domain.Invoices;
public interface InvoiceService
{
// Invoices
List<Invoices> getInvoices();
void insertInvoice(Invoices invoices);
void deleteInvoice(Invoices invoices);
void updateInvoice(Invoices invoices);
// Invoice Details
List<InvoiceDetails> getInvoiceDetails();
void insertInvoiceDetail(InvoiceDetails invoiceDetails);
void deleteInvoiceDetail(InvoiceDetails invoiceDetails);
void updateInvoiceDetail(InvoiceDetails invoiceDetails);
}
```
实现类代码如下:
```java
package com.af.core.services;
import com.af.core.dao.InvoiceDao;
import com.af.core.domain.InvoiceDetails;
import com.af.core.domain.Invoices;
import java.util.List;
import java.io.Serializable;
public class InvoiceServiceImpl implements Serializable, InvoiceService
{
// injected by Spring
InvoiceDao invoiceDao;
public InvoiceDao getInvoiceDao() {
return invoiceDao;
}
public void setInvoiceDao(InvoiceDao invoiceDao) {
this.invoiceDao = invoiceDao;
}
// Invoices
public List<Invoices> getInvoices() {
return invoiceDao.getInvoices();
}
public void insertInvoice(Invoices invoices) {
invoiceDao.insertInvoice(invoices);
}
public void deleteInvoice(Invoices invoices) {
invoiceDao.deleteInvoice(invoices);
}
public void updateInvoice(Invoices invoices) {
invoiceDao.updateInvoice(invoices);
}
// Invoice Details
public List<InvoiceDetails> getInvoiceDetails() {
return invoiceDao.getInvoiceDetails();
}
public void insertInvoiceDetail(InvoiceDetails invoiceDetails) {
invoiceDao.insertInvoiceDetail(invoiceDetails);
}
public void deleteInvoiceDetail(InvoiceDetails invoiceDetails) {
invoiceDao.deleteInvoiceDetail(invoiceDetails);
}
public void updateInvoiceDetail(InvoiceDetails invoiceDetails) {
invoiceDao.updateInvoiceDetail(invoiceDetails);
}
}
```
- **媒体服务**:维护整个系统的音频、视频和文档的文件位置,通过存储服务器文件系统上文件的指针来处理媒体。接口代码如下:
```java
package com.af.core.services;
import java.util.List;
import com.af.core.domain.Media;
public interface MediaService
{
// Media
List<Media> getMedia();
void insertMedia(Media media);
void deleteMedia(Media media);
void updateMedia(Media media);
}
```
实现类代码如下:
```java
package com.af.core.services;
import com.af.core.dao.MediaDao;
import com.af.core.domain.Media;
import java.util.List;
import java.io.Serializable;
public class MediaServiceImpl implements Serializable, MediaService
{
// injected by Spring
MediaDao mediaDao;
public MediaDao getMediaDao() {
return mediaDao;
}
public void setMediaDao(MediaDao mediaDao) {
this.mediaDao = mediaDao;
}
// Media
public List<Media> getMedia() {
return mediaDao.getMedia();
}
public void insertMedia(Media media) {
mediaDao.insertMedia(media);
}
public void deleteMedia(Media media) {
mediaDao.deleteMedia(media);
}
public void updateMedia(Media media) {
mediaDao.updateMedia(media);
}
}
```
- **项目服务**:是应用的主要组件,从数据角度控制项目管理的各个方面。接口代码如下:
```java
package com.af.core.services;
import com.af.core.domain.Issues;
import com.af.core.domain.ProjectRisks;
import com.af.core.domain.Projects;
import com.af.core.domain.ProjectTasks;
import java.util.List;
public interface ProjectService
{
// Projects
List<Projects> getProjects();
void insertProject(Projects project);
void deleteProject(Projects project);
void updateProject(Projects project);
// Project Tasks
List<ProjectTasks> getProjectTasks();
void insertProjectTask(ProjectTasks projectTasks);
void deleteProjectTask(ProjectTasks projectTasks);
void updateProjectTask(ProjectTasks projectTasks);
// Project Risks
List<ProjectRisks> getProjectRisks();
void insertProjectRisk(ProjectRisks projectRisk);
void deleteProjectRisk(ProjectRisks projectRisk);
void updateProjectRisk(ProjectRisks projectRisk);
// Issues
List<Issues> getIssues();
void insertIssue(Issues issue);
void deleteIssue(Issues issue);
void updateIssue(Issues issue);
}
```
实现类代码如下:
```java
package com.af.core.services;
import com.af.core.dao.ProjectDao;
import com.af.core.domain.Issues;
import com.af.core.domain.ProjectRisks;
import com.af.core.domain.ProjectTasks;
import com.af.core.domain.Projects;
import java.util.List;
import java.io.Serializable;
public class ProjectServiceImpl implements Serializable, ProjectService
{
// injected by Spring
ProjectDao projectDao;
public ProjectDao getProjectDao() {
return projectDao;
}
public void setProjectDao(ProjectDao projectDao) {
this.projectDao = projectDao;
}
// Projects
public List<Projects> getProjects() {
return projectDao.getProjects();
}
public void insertProject(Projects project) {
projectDao.insertProject(project);
}
public void deleteProject(Projects project) {
projectDao.deleteProject(project);
}
public void updateProject(Projects project) {
projectDao.updateProject(project);
}
// Project Tasks
public List<ProjectTasks> getProjectTasks() {
return projectDao.getProjectTasks();
}
public void insertProjectTask(ProjectTasks projectTask) {
projectDao.insertProjectTask(projectTask);
}
public void deleteProjectTask(ProjectTasks projectTask) {
projectDao.deleteProjectTask(projectTask);
}
public void updateProjectTask(ProjectTasks projectTask) {
projectDao.updateProjectTask(projectTask);
}
// Project Risks
public List<ProjectRisks> getProjectRisks() {
return projectDao.getProjectRisks();
}
public void insertProjectRisk(ProjectRisks projectRisk) {
projectDao.insertProjectRisk(projectRisk);
}
public void deleteProjectRisk(ProjectRisks projectRisk) {
projectDao.deleteProjectRisk(projectRisk);
}
public void updateProjectRisk(ProjectRisks projectRisk) {
projectDao.updateProjectRisk(projectRisk);
}
// Issues
public List<Issues> getIssues() {
return projectDao.getIssues();
}
public void insertIssue(Issues issue) {
projectDao.insertIssue(issue);
}
public void deleteIssue(Issues issue) {
projectDao.deleteIssue(issue);
}
public void updateIssue(Issues issue) {
projectDao.updateIssue(issue);
}
}
```
#### 5. 使用Hibernate实现DAO层
DAO层负责访问数据库以执行CRUD操作(创建、读取、更新和删除Java对象)。为了简化JDBC功能并与MySQL数据库集成,使用Hibernate作为ORM框架。Hibernate结合事务管理,确保DAO方法在事务期间保护数据不被损坏,并将数据库结果映射回带注解的领域对象。
以下是创建DAO层的详细步骤:
1. **生成唯一对象标识符**:为了避免数据库自动递增功能可能导致的对象模型中重复的objectIdentifier,使用AFObjID工具类生成唯一的对象标识符。代码如下:
```java
package com.af.common.util;
import java.util.Date;
public class AFObjID
{
// Singleton instance
private static AFObjID myInstance;
public static int varianceID = 0;
private static long previousTime = 0;
private static int currentTime = 0;
private AFObjID(){}
public
```
0
0
复制全文
相关推荐










