【问题标题】:generic service and controller spring通用服务和控制器弹簧
【发布时间】:2013-11-13 20:44:08
【问题描述】:
    package com.lhoussaine.springjsfjpa.entities;

    @Table(name="address")
    @Entity
    public class Address {

             @Id
             @GeneratedValue(strategy = GenerationType.AUTO)
             private int id;
             private String streetNumber;
             private String streetName;
             private String city;
             getter/setter 
    }

我有 30 个实体。

现在仓库:

package com.lhoussaine.springjsfjpa.repositories;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.rest.repository.annotation.RestResource;
import com.lhoussaine.springjsfjpa.entities.Address;

@RestResource(rel="address", path="address")
public interface AddressRepository extends JpaRepository<Address,Integer> { 

}

这里我不需要实现 CRUD 操作!感谢 spring-data-jpa!我希望控制器和服务具有相同的标准:

public interface IAddressService {
}


package com.lhoussaine.springjsfjpa.services.generic;

import java.util.List;

public abstract class GenericService<T,K> {         
     public abstract T create(T saved);     
     public abstract void remove(T deleted);    
     public abstract T findById(K id) ;     
     public abstract List<T> findAll();
     public abstract T removeById(K id); 
}


package com.lhoussaine.springjsfjpa.services.impl;

 @Service 
 @Transactional 
 public class AddressService extends GenericService<Address, Integer> implements IAddressService {  
    @Autowired private AddressRepository iaddressRepository;

    public Address create(Address saved) {      
               Address address=saved;
        return iaddressRepository.save(address);    
       }

     public void remove(Address deleted) {
        iaddressRepository.delete(deleted);     
       }

     public Address findById(Integer id) {      
                return iaddressRepository.findOne(id);  
       }

     public List<Address> findAll() {       
               return iaddressRepository.findAll();     
        }

     public Address removeById(Integer id) {        
               Address addr= iaddressRepository.findOne(id);        
               if(addr!=null){
           iaddressRepository.delete(addr);         
               }        
               return addr;
       }
 }

现在的问题是:有了控制器我怎么办? 为每个类开发一个控制器?知道我有 30 个服务类。 是否有一些接近相同标准的东西,例如 Spring Data JPA,但对于服务和控制器? 正如您在服务类中看到的那样!我有义务创建GenericService 类并为我的包实体中的每个类创建一个接口。

【问题讨论】:

  • 将您的代码格式化为代码,而不是引用文本。正确缩进。

标签: spring hibernate spring-data-jpa generic-programming


【解决方案1】:

控制器和服务不应该是通用的。虽然可以理解应用程序中的每个实体都可以通过 ID 创建或查找,但服务应该只具有实现应用程序业务逻辑所需的方法。

并且应该创建控制器来实现应用程序的 UI 层。因此,一旦您对应用程序的特定页面的外观和工作方式有了规范(或清晰的想法),然后实现控制器和服务来实现该页面。

如果您的应用程序非常通用,以至于它所做的只是创建、更新和删除表中的行,那么您不需要实现任何东西:像 PHPMyAdmin 这样的通用数据库 Web 界面就可以了。

【讨论】:

  • Merci Jean-baptiste.:) 我当然知道!但只要知道有一个框架可以让生活变得轻松。非常感谢!
  • 您知道这一点,但您仍在寻找通用服务和通用控制器。你不应该有通用服务和通用控制器。每个实体类不应该有一个服务,每个实体类有一个控制器。
【解决方案2】:

您只能在没有注释的情况下使用通用服务和控制器,即使用 XML 配置。对于控制器,您还必须为每个控制器设置 Map 并扩展(覆盖) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping 以使用它。 见例子https://sites.google.com/site/beigeerp/home/spring-generic-controller

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    相关资源
    最近更新 更多