@OneToOne or @ManyToOne

  1. Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.lpp.domain.User.roles references an unknown entity: java.util.List
  2. at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:97) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
  3. at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processEndOfQueue(InFlightMetadataCollectorImpl.java:1786) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
  4. at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processFkSecondPassesInOrder(InFlightMetadataCollectorImpl.java:1730) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
  5. at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1617) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
  6. at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
  7. at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final]
  8. at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final]
  9. at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[spring-orm-4.3.6.RELEASE.jar:4.3.6.RELEASE]
  10. at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353) ~[spring-orm-4.3.6.RELEASE.jar:4.3.6.RELEASE]
  11. at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373) ~[spring-orm-4.3.6.RELEASE.jar:4.3.6.RELEASE]
  12. at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362) ~[spring-orm-4.3.6.RELEASE.jar:4.3.6.RELEASE]
  13. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
  14. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
  15. ... 44 common frames omitted

解决办法:

将:

  1. @Entity
  2. public class User {
  3.  
  4. @Id
  5. @GeneratedValue
  6. private Long id;
  7.  
  8. private String name;
  9. @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")//保证存取时有正确的格式
  10. private Date createDate;
  11. @ManyToOne
  12. @JoinColumn(name = "department_id")//user表中使用department_id字段来表示部门id
  13. @JsonBackReference//防止关系对象的递归访问
  14. private Department department;
  15.  
  16. @ManyToOne(cascade = {}, fetch = FetchType.EAGER)
  17. @JoinTable(name = "user_role",
  18. joinColumns = {@JoinColumn(name = "user_id")},
  19. inverseJoinColumns = {@JoinColumn(name = "role_id")})
  20. //中间表user_role来存在各自的id,以表示它们的对应关系
  21. private List<Role> roles;

改为:

  1. @Entity
  2. public class User {
  3.  
  4. @Id
  5. @GeneratedValue
  6. private Long id;
  7.  
  8. private String name;
  9. @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")//保证存取时有正确的格式
  10. private Date createDate;
  11. @ManyToOne
  12. @JoinColumn(name = "department_id")//user表中使用department_id字段来表示部门id
  13. @JsonBackReference//防止关系对象的递归访问
  14. private Department department;
  15.  
  16. @ManyToMany(fetch = FetchType.EAGER)
  17. @JoinTable(name = "user_role",
  18. joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "ID")},
  19. inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "ID")})
  20. //中间表user_role来存在各自的id,以表示它们的对应关系
  21. private List<Role> roles;

Spring Boot 项目(参考1) 提供了一个类似ASP.NET MVC的默认模板一样的标准样板,直接集成了一系列的组件并使用了默认的配置。使用Spring Boot 不会降低学习成本,甚至增加了学习成本,但显著降低了使用成本并提高了开发效率。如果没有Spring基础不建议直接上手。

1.基础项目

这里只关注基于Maven的项目构建,使用Spring Boot CLI命令行工具和Gradle构建方式请参考官网。

(1)创建项目:

创建类型为quickstart的Maven项目,删除默认生成的.java文件保持默认的Maven目录即可。

(2)修改/pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.example</groupId>
  6. <artifactId>myproject</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <properties>
  9. <java.version>1.8</java.version>
  10. </properties>
  11. <parent>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-parent</artifactId>
  14. <version>1.3.1.RELEASE</version>
  15. </parent>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-web</artifactId>
  20. </dependency>
  21. </dependencies>
  22. </project>

(3)添加/src/main/sample/controller/HomeController.java文件:

  1. package simple.controller;
  2.  
  3. import org.springframework.web.bind.annotation.*;
  4.  
  5. @RestController
  6. public class HomeController {
  7.  
  8. @RequestMapping("/")
  9. public String index() {
  10. return "Hello World!";
  11. }
  12. }

(4)添加/src/main/sample/Application.java文件:

  1. package simple;
  2.  
  3. import org.springframework.boot.*;
  4. import org.springframework.boot.autoconfigure.*;
  5. import simple.controller.*;
  6.  
  7. @EnableAutoConfiguration
  8. public class Application {
  9.  
  10. public static void main(String[] args) throws Exception {
  11. SpringApplication.run(new Object[] { Application.class, HomeController.class }, args);
  12. }
  13.  
  14. }

在浏览器中输入http://localhost:8080/,即可直接看到"Hello World"运行结果。

2. 添加数据访问支持

(1)修改pom,添加spring-boot-starter-data-jpa和h2依赖:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.example</groupId>
  6. <artifactId>myproject</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <properties>
  9. <java.version>1.8</java.version>
  10. </properties>
  11. <parent>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-parent</artifactId>
  14. <version>1.3.1.RELEASE</version>
  15. </parent>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-web</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-data-jpa</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>com.h2database</groupId>
  27. <artifactId>h2</artifactId>
  28. <scope>runtime</scope>
  29. </dependency>
  30. </dependencies>
  31. </project>

如果需要在控制台查看生成SQL语句,可以添加/src/main/resources/application.properties

  1. 1 spring.h2.console.enabled=true
  2. 2 logging.level.org.hibernate.SQL=debug

(2)添加实体

添加User、Role、Category和Post实体。

User:

  1. package simple.domain;
  2.  
  3. import java.util.*;
  4.  
  5. import javax.persistence.*;
  6.  
  7. @Entity
  8. public class User {
  9. @Id
  10. @GeneratedValue
  11. private Long id;
  12.  
  13. private String userName;
  14.  
  15. private String password;
  16.  
  17. private String Email;
  18.  
  19. @javax.persistence.Version
  20. private Long Version;
  21.  
  22. @ManyToMany(cascade = CascadeType.ALL)
  23. private List<Role> roles = new ArrayList<Role>();
  24.  
  25. public Long getId() {
  26. return id;
  27. }
  28.  
  29. public void setId(Long id) {
  30. this.id = id;
  31. }
  32.  
  33. public String getUserName() {
  34. return userName;
  35. }
  36.  
  37. public void setUserName(String userName) {
  38. this.userName = userName;
  39. }
  40.  
  41. public String getPassword() {
  42. return password;
  43. }
  44.  
  45. public void setPassword(String password) {
  46. this.password = password;
  47. }
  48.  
  49. public String getEmail() {
  50. return Email;
  51. }
  52.  
  53. public void setEmail(String email) {
  54. Email = email;
  55. }
  56.  
  57. public List<Role> getRoles() {
  58. return roles;
  59. }
  60.  
  61. public void setRoles(List<Role> roles) {
  62. this.roles = roles;
  63. }
  64.  
  65. public Long getVersion() {
  66. return Version;
  67. }
  68.  
  69. public void setVersion(Long version) {
  70. Version = version;
  71. }
  72. }

Role:

  1. package simple.domain;
  2.  
  3. import java.util.*;
  4.  
  5. import javax.persistence.*;
  6.  
  7. @Entity
  8. public class Role {
  9. @Id
  10. @GeneratedValue
  11. private Long id;
  12.  
  13. private String roleName;
  14.  
  15. @ManyToMany(cascade = CascadeType.ALL)
  16. private List<User> users = new ArrayList<User>();
  17.  
  18. public Long getId() {
  19. return id;
  20. }
  21.  
  22. public void setId(Long id) {
  23. this.id = id;
  24. }
  25.  
  26. public String getRoleName() {
  27. return roleName;
  28. }
  29.  
  30. public void setRoleName(String roleName) {
  31. this.roleName = roleName;
  32. }
  33.  
  34. public List<User> getUsers() {
  35. return users;
  36. }
  37.  
  38. public void setUsers(List<User> users) {
  39. this.users = users;
  40. }
  41. }

Category:

  1. package simple.domain;
  2.  
  3. import java.util.*;
  4.  
  5. import javax.persistence.*;
  6.  
  7. @Entity
  8. public class Category {
  9. @Id
  10. @GeneratedValue
  11. private Long id;
  12.  
  13. private String Name;
  14.  
  15. @OneToMany
  16. private List<Post> posts = new ArrayList<Post>();
  17.  
  18. public Long getId() {
  19. return id;
  20. }
  21.  
  22. public void setId(Long id) {
  23. this.id = id;
  24. }
  25.  
  26. public String getName() {
  27. return Name;
  28. }
  29.  
  30. public void setName(String name) {
  31. Name = name;
  32. }
  33.  
  34. public List<Post> getPosts() {
  35. return posts;
  36. }
  37.  
  38. public void setPosts(List<Post> posts) {
  39. this.posts = posts;
  40. }
  41. }

Post:

  1. package simple.domain;
  2.  
  3. import java.util.*;
  4.  
  5. import javax.persistence.*;
  6.  
  7. @Entity
  8. public class Post {
  9. @Id
  10. @GeneratedValue
  11. private Long id;
  12.  
  13. private String Name;
  14.  
  15. private String Html;
  16.  
  17. private String Text;
  18.  
  19. private Date CreateAt;
  20.  
  21. @ManyToOne
  22. private Category category;
  23.  
  24. public Long getId() {
  25. return id;
  26. }
  27.  
  28. public void setId(Long id) {
  29. this.id = id;
  30. }
  31.  
  32. public String getName() {
  33. return Name;
  34. }
  35.  
  36. public void setName(String name) {
  37. Name = name;
  38. }
  39.  
  40. public String getHtml() {
  41. return Html;
  42. }
  43.  
  44. public void setHtml(String html) {
  45. Html = html;
  46. }
  47.  
  48. public String getText() {
  49. return Text;
  50. }
  51.  
  52. public void setText(String text) {
  53. Text = text;
  54. }
  55.  
  56. public Date getCreateAt() {
  57. return CreateAt;
  58. }
  59.  
  60. public void setCreateAt(Date createAt) {
  61. CreateAt = createAt;
  62. }
  63.  
  64. public Category getCategory() {
  65. return category;
  66. }
  67.  
  68. public void setCategory(Category category) {
  69. this.category = category;
  70. }
  71. }

(3)添加资源库

添加UserRepository、RoleRepository、CategoryRepository和PostRepository接口,无需实现。

UserRepository:

  1. package simple.repository;
  2.  
  3. import org.springframework.data.repository.*;
  4.  
  5. import simple.domain.*;
  6.  
  7. public interface UserRepository extends CrudRepository<User, Long> {
  8.  
  9. }

RoleRepository

  1. package simple.repository;
  2.  
  3. import org.springframework.data.repository.*;
  4.  
  5. import simple.domain.*;
  6.  
  7. public interface RoleRepository extends CrudRepository<Role, Long> {
  8.  
  9. }

CategoryRepository

  1. package simple.repository;
  2.  
  3. import org.springframework.data.repository.*;
  4.  
  5. import simple.domain.*;
  6.  
  7. public interface CategoryRepository extends CrudRepository<Category, Long> {
  8.  
  9. }

PostRepository

  1. package simple.repository;
  2.  
  3. import org.springframework.data.repository.*;
  4.  
  5. import simple.domain.*;
  6.  
  7. public interface PostRepository extends CrudRepository<User, Long> {
  8.  
  9. }

(4)在控制器中注入资源库接口

  1. package simple.controller;
  2.  
  3. import org.springframework.beans.factory.annotation.*;
  4. import org.springframework.web.bind.annotation.*;
  5.  
  6. import simple.repository.*;
  7.  
  8. @RestController
  9. public class HomeController {
  10.  
  11. private UserRepository userRepository;
  12. private RoleRepository roleRepository;
  13. private CategoryRepository categoryRepository;
  14. private PostRepository postReppository;
  15.  
  16. @Autowired
  17. public HomeController(UserRepository userRepository, RoleRepository roleRepository,
  18. CategoryRepository categoryRepository, PostRepository postReppository) {
  19. this.userRepository = userRepository;
  20. this.roleRepository = roleRepository;
  21. this.categoryRepository = categoryRepository;
  22. this.postReppository = postReppository;
  23. }
  24.  
  25. @RequestMapping("/")
  26. public long index() {
  27. return userRepository.count();
  28. }
  29. }

使用事务时在方法上应用注解@Transactional

3.添加验证和授权支持

(1)添加spring-boot-starter-security依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.example</groupId>
  6. <artifactId>myproject</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <properties>
  9. <java.version>1.8</java.version>
  10. </properties>
  11. <parent>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-parent</artifactId>
  14. <version>1.3.1.RELEASE</version>
  15. </parent>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-web</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-data-jpa</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>com.h2database</groupId>
  27. <artifactId>h2</artifactId>
  28. <scope>runtime</scope>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-starter-security</artifactId>
  33. </dependency>
  34. </dependencies>
  35. </project>

(2)修改Application.java

  1. package simple;
  2.  
  3. import org.springframework.boot.*;
  4. import org.springframework.boot.autoconfigure.*;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.security.config.annotation.method.configuration.*;
  7. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  8. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  9. import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
  10.  
  11. import simple.controller.*;
  12.  
  13. @EnableAutoConfiguration
  14. @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
  15. public class Application {
  16.  
  17. public static void main(String[] args) throws Exception {
  18. SpringApplication.run(new Object[] { Application.class, HomeController.class }, args);
  19. }
  20.  
  21. @Bean
  22. public WebSecurityConfigurerAdapter webSecurityConfigurerAdapter() {
  23. return new MyWebSecurityConfigurer();
  24. }
  25.  
  26. public static class MyWebSecurityConfigurer extends WebSecurityConfigurerAdapter {
  27. @Override
  28. protected void configure(HttpSecurity http) throws Exception {
  29. http.csrf().disable();
  30. http.authorizeRequests().antMatchers("/account**", "/admin**").authenticated();
  31. http.formLogin().usernameParameter("userName").passwordParameter("password").loginPage("/login")
  32. .loginProcessingUrl("/login").successHandler(new SavedRequestAwareAuthenticationSuccessHandler())
  33. .and().logout().logoutUrl("/logout").logoutSuccessUrl("/");
  34. http.rememberMe().rememberMeParameter("rememberMe");
  35.  
  36. }
  37. }
  38. }

访问http://localhost:8080/account会自动跳转到login登录页。Spring Security的具体使用前文已有所述。

参考:

(1)https://github.com/spring-projects/spring-boot

(2)http://projects.spring.io/spring-boot/

http://www.cnblogs.com/easygame/p/5122522.html

Java Web系列:Spring Boot 基础 (转)的更多相关文章

  1. 传统Java Web(非Spring Boot)、非Java语言项目接入Spring Cloud方案

    技术架构在向spring Cloud转型时,一定会有一些年代较久远的项目,代码已变成天书,这时就希望能在不大规模重构的前提下将这些传统应用接入到Spring Cloud架构体系中作为一个服务以供其它项 ...

  2. 传统Java Web(非Spring Boot)、非Java语言项目接入Spring Cloud方案--temp

    技术架构在向spring Cloud转型时,一定会有一些年代较久远的项目,代码已变成天书,这时就希望能在不大规模重构的前提下将这些传统应用接入到Spring Cloud架构体系中作为一个服务以供其它项 ...

  3. Java Web系列:JDBC 基础

    ADO.NET在Java中的对应技术是JDBC,企业库DataAccessApplicationBlock模块在Java中的对应是spring-jdbc模块,EntityFramework在Java中 ...

  4. Java Web系列:Hibernate 基础

    从以下5个方面学习hibernate ORM. (1)配置文件:hibernate.cfg.xml XML文件和hibernate.properties属性文件 (2)实体映射:1对多.多对多 (3) ...

  5. Java Web系列:Spring Security 基础

    Spring Security虽然比JAAS进步很大,但还是先天不足,达不到ASP.NET中的认证和授权的方便快捷.这里演示登录.注销.记住我的常规功能,认证上自定义提供程序避免对数据库的依赖,授权上 ...

  6. Spring Boot 基础,理论,简介

    Spring Boot 基础,理论,简介 1.SpringBoot自动装配 1.1 Spring装配方式 1.2 Spring @Enable 模块驱动 1.3 Spring 条件装配 2.自动装配正 ...

  7. Spring Boot 基础

    Spring Boot 基础 Spring Boot 项目(参考1) 提供了一个类似ASP.NET MVC的默认模板一样的标准样板,直接集成了一系列的组件并使用了默认的配置.使用Spring Boot ...

  8. spring boot基础学习教程

    Spring boot 标签(空格分隔): springboot HelloWorld 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新 ...

  9. spring boot基础 入门

    spring boot基础 spring boot 的简单搭建 spring boot 的基本用法 spring boot 基本用法 自动配置 技术集成 性能监控 源码解析 工程的构建 创建一个mav ...

  10. 第64节:Java中的Spring Boot 2.0简介笔记

    Java中的Spring Boot 2.0简介笔记 spring boot简介 依赖java8的运行环境 多模块项目 打包和运行 spring boot是由spring framework构建的,sp ...

随机推荐

  1. js检测浏览器中是否安装了flash播放插件

    这两天工作中需要在网页中嵌入flash小游戏,我使用的是swfobject.js version:1.5.其他方面都很好,唯独版本检测这里一直没有搞通,后来实在无奈之下,改用js来检测浏览器的flas ...

  2. oracle看到用户的所有表名、表睐、字段名称、现场的目光、是空的、字段类型

    --oracle看到用户的所有表名.表睐.字段名称.现场的目光.是空的.字段类型 select distinct TABLE_COLUMN.*, TABLE_NALLABLE.DATA_TYPE, T ...

  3. mysql经常使用的命令

    如何登陆数据库     飞机着陆     mysql -u <username> -p     访问本机数据库     mysql -u <username> -D <d ...

  4. DLNA它 Error, can&#39;t findlibavformat ! 解

    DLNA库版本号为libdlna-0.2.4 运行./configure出错: ------------------------------ Error, can't findlibavformat ...

  5. 对于Hadoop的MapReduce编程makefile

    根据近期需要hadoop的MapReduce程序集成到一个大的应用C/C++书面框架.在需求make当自己主动MapReduce编译和打包的应用. 在这里,一个简单的WordCount1一个例子详细的 ...

  6. oracle 锁表、解锁的语句

     --1.以下的语句用来查询哪些对象被锁: select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_object ...

  7. Quartz.NET学习系列

    Quartz.NET它是一个开源的任务调度引擎,对于周期性任务,持久性任务提供了很好的支持,并且支持持久性.集群等功能. 这是什么对我来说Quartz.NET学习记录: 源代码下载http://yun ...

  8. GIT用服务器上的版本强制覆盖掉本地的版本(转)

    以前在机子上使用git下载了linux git版本库上的源代码,由于在阅读源代码的过程中,难免会对本地的文件进行修改,这样就导致本地文件与服务器上的文件版本不一致,我想做的就是用服务器上的版本强制覆盖 ...

  9. SDL 简单入门学习

    write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 概要 实际学习使用SDL创建窗体,并绘制图形. 前言 今天想要做一个简单的demo ...

  10. 使用 Cordova+Visual Studio 创建跨平台移动应用(1)

    1简介 本章节是关于Visual Studio Tools for Apache Cordova的,目前此产品只发布了预览版.Visual Studio for Apache Cordova帮助熟悉V ...