Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在SpringMVC中处理泛型实体的最佳方法(泛型、反射或其他)?_Java_Spring_Hibernate_Spring Mvc - Fatal编程技术网

Java 在SpringMVC中处理泛型实体的最佳方法(泛型、反射或其他)?

Java 在SpringMVC中处理泛型实体的最佳方法(泛型、反射或其他)?,java,spring,hibernate,spring-mvc,Java,Spring,Hibernate,Spring Mvc,我有一个名为商业的实体。我有一个类别实体,其中包含商业类别列表。对于每个类别,都有一个单独的实体通过联合继承策略扩展商业(如RestaurantCommercial、PhotoStudioCommercial等,总计20个实体) 商业实体持有一些公司商业广告的标题、文本联系人号码等一般属性,而RestaurantCommercial和PhotoStudioCommercial持有与该类别相关的其他特定属性 问题是为每个实体编写一个单独的dao和控制器需要大量的工作,所以我正在寻找一种处理这个问题

我有一个名为商业的实体。我有一个类别实体,其中包含商业类别列表。对于每个类别,都有一个单独的实体通过联合继承策略扩展商业(如RestaurantCommercial、PhotoStudioCommercial等,总计20个实体)

商业实体持有一些公司商业广告的标题、文本联系人号码等一般属性,而RestaurantCommercial和PhotoStudioCommercial持有与该类别相关的其他特定属性

问题是为每个实体编写一个单独的dao和控制器需要大量的工作,所以我正在寻找一种处理这个问题的简洁方法

我需要一个统一的控制器,可能是用于处理表单控制和持久化扩展商业实体的新实例的DAO

以下是我大致的想法:

@RequestMapping(value={"/vendor/commercial/{categoryName}/new"}, method=RequestMethod.GET)
public String showNewCommercialForm(@PathVariable("categoryName") String categoryName,
                                    Map<String, Object> map) {
    Category category = categoryDAO.getCategoryByServiceName(categoryName);

    Class clazz = Class.forName(category.getClassName()); //here className is smth like domain.commercial.RestaurantCommercial

    map.put("commercialInstance", clazz.newInstance());
    //separate view for each category of commercial
    return "vendor/commercial/"+categoryName+"/new";
}
@RequestMapping(value={/vendor/commercial/{categoryName}/new},method=RequestMethod.GET)
公共字符串显示格式(@PathVariable(“categoryName”)字符串categoryName,
(地图){
Category Category=categoryDAO.getCategoryByServiceName(categoryName);
Class clazz=Class.forName(category.getClassName());//这里的类名与domain.commercial.RestaurantCommercial类似
map.put(“commercialInstance”,clazz.newInstance());
//每个类别的商业广告都有单独的视图
返回“供应商/商业/”+类别名称+“/新”;
}
我正在考虑一个类似的控制器来保存表单数据,即使我必须为这些东西编写一个sperate活页夹

所以问题是:如果您已经面临类似的需求(泛型、反射或smth等),您会建议如何处理这个问题,或者最佳实践是什么?或者这是否值得,为什么?
提前感谢。

我为这种情况创建了Dao接口:

public interface Dao<T extends Commercial> {

    T getAll();
}

如果表单输入名称与您的bean名称相同,那么绑定将自动完成所有操作。

是的,这对于DAO实现来说是非常好的,但我更多考虑的是控制器的实现。我想做的事情是创建一个控制器来处理表单并保存商业文档的任何子元素,而不是为每个子元素创建单独的控制器。有什么想法吗?为controller编辑我的答案-也许你们会喜欢这个类似RESTfull的想法。那个绑定呢?这里的主要问题是如何正确处理绑定,这就是我要寻找的。现在我已经开始了标准实现。添加一些绑定示例。Main requerment-表单输入的名称应该与bean属性名称相同。在这里,我找到了关于我所说内容的讨论,他们似乎没有找到任何有效的解决方案。我找到了关于我所说内容的讨论,他们似乎没有找到任何有效的解决方案
public CommonHibernateDao<T extends Commercial> implements Dao<T> 
{
    private final Class<T> entityType;

    protected CommonHibernateDao(Class<T> entityType) {
        this.entityType = entityType;
    }

    public List<T> getAll() {
        // hibernate get all implementation
    }
}
public interface RestaurantCommercialDao extends Dao<RestaurantCommercial> {

}

public class HibernateRestaurantCommercialDao extends CommonHibernateDao<RestaurantCommercial> implements RestaurantCommercialDao {

    public HibernateRestaurantCommercialDao() {
        super(RestaurantCommercial.class);
    }
}
@Controller
public class YourController() {

    @RequestMapping(value = "/restapi/{entityType}")
    public String postEntity(HttpServletRequest request, @PathVariable(value = "entityType") String entityType) {
        // If enetity name will be packegae + class name
        Object beanInstance = Class.forName(entityName);
        ServletRequestDataBinder binder = new ServletRequestDataBinder(beanInstance);
        binder.bind(request);

        // Here by type of entity you can get DAO and persist
    }
}