VUE 的数据引用有多种方式。 直接输出数据 如果我们希望页面中直接输出数据就可以使用: {{ pageNumber }} 双括号引用的方式即可。 在 JavaScript 中引用 如果你需要直接在代码中使用,直接使用变量名就可以了。 上面这张小图,显示了引用的方式。 https://www.ossez.com/t/vue-v-for/14094
VUE 的数据引用有多种方式。 直接输出数据 如果我们希望页面中直接输出数据就可以使用: {{ pageNumber }} 双括号引用的方式即可。 在 JavaScript 中引用 如果你需要直接在代码中使用,直接使用变量名就可以了。 上面这张小图,显示了引用的方式。 https://www.ossez.com/t/vue-v-for/14094
在项目中,需要使用 VUE 的 v-for 循环对列表进行输出。 直接在标签中使用。 <li v-for="data in totalPages" :key="data"> <a class="page-link" href="javascript: void(0);" @click="pageSearch(data )">{{data}}</a> </li> 上面的代码是直接在标签中输出。 根据 totalPages 中的数据大小循环 1 次输出 li 标签。 使用 template 因有时候我们可能还需要对标签进行操作和控制。 如果直接在标签中输出的话,不好对标签进行控制。 因此我们还可以使用 template。 代码如下: <template v-for="pageNumber in totalPages" :key="pageNumber"> <li class="page-item active"> <a class="page-link" href="javascript: void(0);" @click="pageSearch(pageNumber)">{{ pageNumber }}</a> </li> </template> 直接进行使用就可以了。 根据项目中需求,直接进行按照需要进行编码就可以了。 https://www.ossez.com/t/vue-v-for-2/14093
一个 VUE 的项目在本地部署没有问题,但是部署到服务器上的时候提示访问资源的错误。 问题和解决 经过看看代码后才了解到,VUE 可以有几个配置文件。 分别是: .env 和 .env.production,显然后面的这个对应的是你服务器上部署所需要的配置。 如果你在服务器上部署,还是使用 localhost:8080,但是你的服务器可能跑在不是 8080 端口的话,就会导致上面资源请求找不到的情况。 在这里,只需要用真实使用的域名进行替换就可以了。 替换后再部署到服务器上,如果域名都已经配置好了,这样的配置是不会有问题的。 https://www.ossez.com/t/vue/14090
在一个 VUE 的项目中,前端数字被显示为下面的长格式。 这个格式显然不是我们想要的。 我们需要将这一串数组进行格式化。 问题和解决 我们可以使用函数来进行解决。 定义一个方法。 dateFormat: function (date) { if (date === undefined) { return ""; } var moment = require("moment"); return moment(date).format("YYYY-MM-DD"); } 在这个方法是被用来进行格式化的,我们使用了 moment 这个组件。 完整的定义为下面的格式。 然后在数据中直接用这个方法就可以了。 在表格的数据中直接使用。 这样我们就可以对字段进行格式化了。 格式化后的界面显示为: 如果希望在 VUE 中定义一些可以使用的方法,直接定义使用就可以了。 https://www.ossez.com/t/vue/14089
在我们的项目中我们使用 axios 进行异步调用。 因为异步调用的问题,如果我不采取手段,子页面没有办法获得父页面中的数据,页面将会显示为 没有数据。 问题和解决 这个问题的原因就是子组件在初始化的时候,父组件还没有获得数据。 可以使用的方法是 v-if 进行判断。 对比上面我们使用了 v-if 判断的代码和没有使用判断的代码。 上面的代码能够让子组件正确加载数据。 另外一个需要注意的是,在子组件中需要使用 props:['projects','currentPage'], 将数据从父组件中传递过来。 从父组件中将数据传递过来。 https://www.ossez.com/t/vue/14083
Spring 的项目严重依赖注解。 @Repository 注解 在Spring2.0之前的版本中,@Repository注解可以标记在任何的类上,用来表明该类是用来执行与数据库相关的操作(即dao对象),并支持自动处理数据库操作产生的异常 在Spring2.5版本中,引入了更多的Spring类注解:@Component,@Service,@Controller。Component是一个通用的Spring容器管理的单例bean组件。而@Repository, @Service, @Controller 就是针对不同的使用场景所采取的特定功能化的注解组件。 因此,当你的一个类被 @Component 所注解,那么就意味着同样可以用 @Repository, @Service, @Controller来替代它,同时这些注解会具备有更多的功能,而且功能各异。 最后,如果你不知道要在项目的业务层采用 @Service 还是 @Component注解。那么,@Service是一个更好的选择。 就如上文所说的,@Repository早已被支持了在你的持久层作为一个标记可以去自动处理数据库操作产生的异常(译者注:因为原生的java操作数据库所产生的异常只定义了几种,但是产生数据库异常的原因却有很多种,这样对于数据库操作的报错排查造成了一定的影响;而Spring拓展了原生的持久层异常,针对不同的产生原因有了更多的异常进行描述。 所以,在注解了@Repository的类上如果数据库操作中抛出了异常,就能对其进行处理,转而抛出的是翻译后的spring专属数据库异常,方便我们对异常进行排查处理。 通过上面的话来看就是如果是数据库持久层的就使用 @Repository 注解就好了。 根据 Spring Data JPA 的项目,我们会首先定义一个接口,在这个接口上可能会继承 CrudRepository。 如下面的代码: @Repository public interface VisaCheckeeRepository extends CrudRepository<VisaCheckee, Long> { VisaCheckee findVisaCheckeeByCheckeeVisaId(String checkeeVisaId); } 上面的代码中,就算不使用 @Repository 也是可以被扫描到的。 当然我们还是建议使用 @Repository 来注解这个与持久层有关的访问。 如果你还有实现类的话,也记得把你的实现类用 @Repository 注解上。 如果,我们来看看上面的图,就能比较直观的了解 @Repository 这个注解在 Spring 项目中的地位了。 https://www.ossez.com/t/spring-repository/14075
大家都知道 Spring 严重依赖注解。 实际开发的时候,我们用得最多的可能就是下面几个注解了。 注解 用途 @Component 最最普通的注解,表示这个类可以被注入到 Spring 容器中 。 @Repository 用于数据持久层,有关数据库的操作用这个就没错了。 @Service 用于业务逻辑,从数据库中把数据捞出来,我们总要干点什么吧。这个时候可以用这个注解来标记 @Controller 用 MVC 模式中的 C,主要被用来获得访问数据和对数据的返回,通常 JSON 数据格式的处理和生成,以及访问授权,Token 等都放这里。 其实 @Component 是最基本的,如果你希望注入到 Spring 中,并且使用 Spring 来进行管理。 直接用 @Component 没错。 但具体业务也有很多不一样,因此大部分时候都使用特定的注解。 余下 3 个注解的使用也基本上约定俗成了。 按照大家都使用的约定来就好了。 https://www.ossez.com/t/spring/14076
最近应该项目的需要,需要使用一个工具类来访问数据库。 但是这个工具类又被定义成静态访问了。 我们也需要设置一个静态变量来访问数据库。 @Autowired private static VisaRepository visaRepository; private static VisaCheckeeRepository visaCheckeeRepository; 上面的代码在编译的时候是没有问题的。 但是在程序运行的时候提示空对象异常。 类加载后静态成员是在内存的共享区,静态方法里面的变量必然要使用静态成员变量。 通过日志我们可以非常明确的知道上面异常的主要原因就是因为 VisaRepository 这个变量没有初始化,简单来说就是没有被 @Autowired 上去。 问题和解决 在 Spring 框架中,不能 @Autowired一个静态变量,使之成为一个Spring bean。 这是因为当类加载器加载静态变量时,Spring上下文尚未加载。所以类加载器不会在bean中正确注入静态类。 这个和静态变量这个属性有关的,因为静态变量总是先于 Spring 的 上下文加载。 使用构造函数 其实 IDEA 已经非常明确的建议我们不要使用变量 @Autowired 的方式。 而建议使用构造方法或者 Setter 的方式。 Marks a constructor, field, setter method, or config method as to be autowired by Spring's dependency injection facilities. This is an alternative to the JSR-330 javax.inject.Inject annotation, adding required-vs-optional semantics. 在这个时候,我们只需要简单的将 @Autowired 放到构造方法上。 按照下面这样写就可以了。 private static VisaRepository visaRepository; private static VisaCheckeeRepository visaCheckeeRepository; @Autowired public CheckeeUtils(VisaCheckeeRepository visaCheckeeRepository, VisaRepository visaRepository) { this.visaCheckeeRepository = visaCheckeeRepository; this.visaRepository = visaRepository; } setter 给静态变量加一个 setter 方法,并在这个方法上加上@Autowired。 Spring 就能扫描到AutowiredTypeComponent 的 bean,然后通过setter方法注入。 @Autowired public static void setVisaRepository(VisaRepository visaRepository) { CheckeeUtils.visaRepository = visaRepository; } 定义 2 个变量 可以定义一个静态变量,一个非静态变量。 然后使用 @PostConstruct 注解。 这个注解是 JavaEE 使用的,我们通过注解就知道,这个注解就是在构造方法被执行后下一个执行的方法。 我们可以在这里对我们的静态变量初始化。 @Component public class TestClass { private static AutowiredTypeComponent component; @Autowired private AutowiredTypeComponent autowiredComponent; @PostConstruct private void beforeInit() { component = this.autowiredComponent; } // 调用静态组件的方法 public static void testMethod() { component.callTestMethod(); } } 使用 Spring 的工具类获取 Bean 这个方法就是直接调用 Spring 的上下文工具来获得组件。 AutowiredTypeComponent component = SpringApplicationContextUtil.getBean("component"); component.callTestMethod(); 这个方法实在太麻烦,每一次要用的时候都要调用一次,增加不少容易的代码。 总结 这个问题就是 Spring 的 Bean 在什么时候初始化的问题。 如果没有初始化的话,是没有办法直接调用和自动加载的。 根据官方的提示,不要使用变量上的自动加载,使用构造方法的自动加载就可以了,这个也是官方推荐的方式。 https://www.ossez.com/t/spring-autowired/14074
错误信息如下: java.lang.NullPointerException at com.usvisatrack.common.data.tests.jpa.UserRepositoryTest.testInsert(UserRepositoryTest.java:57) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) 上面的错误信息提示的就是因为 userRepository 为空,我们不能进行数据库有关的操作。 问题和解决 尽管我们在测试中定义了: private UserRepository userRepository; 很显然的是 Spring 没有 Autowired。 主要原因是因为 Spring 的测试严重依赖 Spring。 我们没有对 Spring 进行初始化,是不能进行测试的。 因为我们这个代码是对 JPA 进行测试的,因此只需要在测试代码的最上端添加 @DataJpaTest 这个注解就可以了。 需要注意的就是,对 Spring 进行任何测试,包括测试 JPA 或者 API ,都需要对 Spring 进行初始化。 https://www.ossez.com/t/spring-data-repository/14071
@DataJpaTest 这个注解主要用来在 Spring 项目中测试 JPA 数据源。 默认情况下,带有 @DataJpaTest 注解的测试使用嵌入式内存数据库。 因此 @DataJpaTest 这个注解还是有点坑的。 默认数据库 默认采用的是嵌入的 H2 数据库。 就算你配置了数据库链接,如果你不使用下面的注解的话,@DataJpaTest 还是会使用配置的默认数据库。 使用注解: @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) 来让你的程序只使用你提供的数据库连接来进行连接。 事务 @DataJpaTest 具有事务性,会自动回滚插入数据。 如果你的不进行配置的话,你会发现你插入的数据没有办法在数据库中出现。 解决办法就是在方法中,提供 @Commit 注解。 然后再对数据库中的数据进行校验,这个时候数据是不会回滚的。 从日志中,我们也可以看到,插入的数据被回滚了。 当我们提供 Commit 这个注释后,在日志中明确的提示已经提交了。 表 hibernate_sequence 这是因为我们在数据库实体类配置的时候,没有指定主键策略。 在默认情况使用的是 Auto。 如果使用 Auto,Hibernate 将会使用 Oracle 的方式来自增的。 如果需要使用 Mysql 的话,你的实体类需要将主键策略修改为: @GeneratedValue(strategy = GenerationType.IDENTITY) 因为我们实体类使用了继承 AbstractPersistable。 因此我们可以通过修改 application.properties 来实现。 将参数设置为 false spring.jpa.hibernate.use-new-id-generator-mappings=false 这样就会对主键的策略进行修改了,我们就可以避免上面的这个问题了。 https://www.ossez.com/t/datajpatest/14070