标签: spring-annotations

测试Spring @MVC注释

前几天我遇到了一个问题,其中一个@Valid注释被意外地从控制器类中删除了.不幸的是,它没有破坏我们的任何测试.我们的单元测试都没有实际运行Spring AnnotationMethodHandlerAdapter路径.我们直接测试我们的控制器类.

如果我的@MVC注释错误,我该如何编写一个正确失败的单元或集成测试?有没有办法我可以让Spring找到并使用MockHttpServlet查找和运用相关的控制器?

java spring unit-testing spring-mvc spring-annotations

9
推荐指数
2
解决办法
6681
查看次数

jetty 9 + JDK 8 + spring 4 Annotations

升级到JDK 8后,jetty 9不再能够扫描spring注释:我收到以下错误:

MultiException[java.lang.RuntimeException: Error scanning file ApplicationInitializer.class, java.lang.RuntimeException: Error scanning file HibernateConfig.class, java.lang.RuntimeException: Error scanning file MailConfig.class, java.lang.RuntimeException: Error scanning file ServicesConfig.class, java.lang.RuntimeException: Error scanning file WebAppConfig.class]
at org.eclipse.jetty.annotations.AnnotationConfiguration.scanForAnnotations(AnnotationConfiguration.java:530)
at org.eclipse.jetty.annotations.AnnotationConfiguration.configure(AnnotationConfiguration.java:441)
at org.eclipse.jetty.webapp.WebAppContext.configure(WebAppContext.java:466)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1342)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:745)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:492)
at org.eclipse.jetty.maven.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:282)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:117)
at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:99)
at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:60)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:154)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
Run Code Online (Sandbox Code Playgroud)

当我使用jdk 7时工作正常.

它试图扫描的注释是spring framework 4注释,例如:

@Configuration
@EnableWebMvc
@ComponentScan("com.cityrentals.rentahouse")
@Import({ HibernateConfig.class, ServicesConfig.class, MailConfig.class })
public class WebAppConfig extends WebMvcConfigurerAdapter {
Run Code Online (Sandbox Code Playgroud)

无论javaassist依赖性是否存在,都会发生错误

 <dependency>
   <groupId>org.javassist</groupId>
   <artifactId>javassist</artifactId>
   <version>3.18.1-GA</version>
  </dependency>
Run Code Online (Sandbox Code Playgroud)

任何帮助深表感谢 …

spring-annotations java-8 jetty-9 spring-4

9
推荐指数
1
解决办法
6631
查看次数

如果我们已经使用了 componentScan 注释,为什么还需要 EntityScan 、 EnableJpaRepositories 注释?

我已经在 app类ComponentScan中使用注释,但是如果我仅使用此注释,它将在获取存储库引用时出现问题。因此,为了克服这个问题,我正在使用和注释。MainSpring BootEntityScanEnableJpaRepositoriescomponentScan

@EntityScan(basePackages={"com.gonkar.fleetms.models"})
@EnableJpaRepositories(basePackages={"com.gonkar.fleetms.repositories"})
Run Code Online (Sandbox Code Playgroud)

所以我的问题是为什么需要使用其他两个注释?如果我已经在使用@ComponentScan.

java spring spring-annotations spring-boot

9
推荐指数
1
解决办法
8419
查看次数

具有注释驱动的弹簧任务的多个弹簧任务执行器

我有一个类MessageProcessor被另一个类中的另一个方法调用(即调用者).

public class Caller {
@Scheduled(filxedDelay=10)
public void poll(){
//do stuff
messageProcessor.process(msg);
}

}

public class MessageProcessor{

@Async(value="abcExecutor")
public void process(String msg){
//do stuff here.
}

}
Run Code Online (Sandbox Code Playgroud)

Spring文件看起来像:

<task:executor id="abcExecutor" pool-size="9" rejection-policy-"CALLER_RUNS"/>
Run Code Online (Sandbox Code Playgroud)

我想添加另一个@Async执行程序:

 @Async(value="defExecutor")
    public void remove(String msg){
    //do stuff here.
    }

@Scheduled(filxedDelay=10)
public void kill(){
//do stuff
messageProcessor.remove(msg);
}
Run Code Online (Sandbox Code Playgroud)

通过在spring文件中添加另一个执行程序:

<task:executor id="defExecutor" pool-size="9" rejection-policy="CALLER_RUNS"/>
Run Code Online (Sandbox Code Playgroud)

但是如何在中添加多个执行程序 <task:annotation-driven executor="abcExecutor" scheduler="scheduler" mode="proxy" proxy-target-class="true"/>

如何使用注释运行这些多个执行程序?

PS:显然,我不希望这两种@Async方法都使用相同的池

java spring scheduled-tasks spring-annotations

8
推荐指数
1
解决办法
9087
查看次数

在Spring中使用通配符通过注释将文件作为资源列表注入

我有一个用作春豆的课程.bean的定义applicationContext.xml如下:

<bean id="myClass" class="com.example.MyClass">
        <property name="cssFiles" value="classpath*:../../cssDir/*.css"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

而且MyClass样子:

...
import org.springframework.core.io.Resource;
...
public class MyClass {
    private List<Resource> cssFiles;

    // methods etc.
}
Run Code Online (Sandbox Code Playgroud)

所以Spring用"classpath*:../../ cssDir /"下的所有扩展名为.css的文件填充cssFiles字段.

现在我正在努力转向完整的注释配置,但我无法用注释做同样的事情.这不起作用:

...
import org.springframework.core.io.Resource;
...
@Component
public class MyClass {
    @Value("classpath*:../../cssDir/*.css")
    private List<Resource> cssFiles;

    // methods etc.
}
Run Code Online (Sandbox Code Playgroud)

你有什么主意吗?

java spring dependency-injection spring-annotations spring-io

8
推荐指数
1
解决办法
5295
查看次数

Spring ComponentScan excludeFilters 注释在 Spring Boot Test 上下文中不起作用

我正在使用 Spring Boot 1.4.3.RELEASE 并希望在运行测试时从扫描中排除某些组件。

@RunWith(SpringRunner.class)
@SpringBootTest
@ComponentScan(
        basePackages = {"com.foobar"},
        excludeFilters =  @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {AmazonKinesisRecordChecker.class, MyAmazonCredentials.class}))
public class ApplicationTests {

    @Test
    public void contextLoads() {
    }

}
Run Code Online (Sandbox Code Playgroud)

尽管有过滤器,当我运行测试时,不需要的组件被加载并且 Spring Boot 崩溃,因为这些类需要 AWS 环境才能正常工作:

2017-01-25 16:02:49.234 ERROR 10514 --- [           main] o.s.boot.SpringApplication               : Application startup failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'amazonKinesisRecordChecker' defined in file 
Run Code Online (Sandbox Code Playgroud)

问题:如何使过滤器工作?

java spring spring-test spring-annotations spring-boot

8
推荐指数
1
解决办法
6552
查看次数

通过环境变量指定@CrossOrigin 起源

是否可以@CrossOrigin通过环境变量指定Annotation的来源?我想这样做,以便我可以对 uat/staging/production 使用相同的代码库。我希望我的 uat/staging 环境可以通过 localhost 访问以进行测试,但我的生产环境只接受来自一个特定端点的请求。

例如,这是我们新 API 的跨源注释用户;

@CrossOrigin(origins = {"http://localhost:9000", "http://example.com"})
Run Code Online (Sandbox Code Playgroud)

这工作正常。在我的本地机器上测试,只有在端口 9000 上运行的网络服务器才能访问我的 API。然后我尝试在我的本地 Windows 机器上设置我的环境变量

ALLOWED_ORIGINS = http://localhost:9000,http://example.com
Run Code Online (Sandbox Code Playgroud)

然后我也更改了注释

@CrossOrigin(origins = "#{'${allowed.origins}'.split(',')}")
Run Code Online (Sandbox Code Playgroud)

现在请求由于 CORS 被阻止。

作为后续问题。我可以将端口设置为通配符吗?以便任何本地主机网络服务器都可以访问 API?

更新

所以我能够通过 - https://spring.io/blog/2015/06/08/cors-support-in-spring-framework#filter-based-cors-support来实现我问题的第一部分

并设置 env 变量 allowedOrigins()

@Value("#{'${allowed.origins}'.split(',')}")
private List<String> allowedOrigins;
Run Code Online (Sandbox Code Playgroud)

然而,对于我的生活,我似乎无法获得任何形式的通配符/模式匹配。我已经尝试了以下两种环境变量;

http://localhost:*
http:\/\/localhost:[0-9]+
Run Code Online (Sandbox Code Playgroud)

我可能不得不将此作为一个单独的问题提出。

java spring environment-variables spring-annotations cors

8
推荐指数
1
解决办法
2964
查看次数

Spring boot Persistence Context注解

我是 Spring Boot 的新手,并尝试在 Spring Boot 中创建一个基本的 REST 示例。我正在从Spring Boot REST 示例网站获取帮助来创建一个基本示例。

大多数事情对我来说都很清楚,但我坚持使用一个注释,该注释用于使用以下代码从数据库中获取数据

package com.springbootrest.repository;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;

import org.springframework.stereotype.Repository;

import com.springbootrest.model.BookDetails;

@Transactional
@Repository
public class BookDetailsRepoImpl implements BookDetailsRepo {

 @PersistenceContext
 private EntityManager entityManager;

 public List<BookDetails> listBookDetails() {
 return (List<BookDetails>) entityManager.createQuery("FROM BookDetails").getResultList();
 }

}
Run Code Online (Sandbox Code Playgroud)

我不明白@PersistenceContext实际是如何工作的 - 谁能解释一下?

java spring spring-annotations spring-boot

8
推荐指数
3
解决办法
9857
查看次数

@RequestMapping 和@PostMapping 有什么区别

在下面的例子中,我试图理解@RequestMapping 和@PostMapping 之间的区别。对于@RequestMapping:

当我通过邮递员执行POST 请求时: http://localhost:8085/call1/initparam1?val=1111,它正确执行。但是当它通过 GET 请求
http://localhost:8085/call1/getparam1 进行时

结果我没有得到 1111。

对于@PostMapping,当我通过邮递员执行POST 请求: http://localhost:8085/call1/initparam2/1999 时,它会正确执行。但是当它通过 GET 请求
http://localhost:8085/call1/getparam1 进行时

结果我没有得到 1999。

请向我解释使用这两种注释有什么区别,因为我花了时间谷歌搜索和研究,但我无法弄清楚为什么第一个例子不起作用。

控制器1

@Controller
@ResponseBody
@RequestMapping("/call1")
public class Call1 {

public String str = "inti";

@RequestMapping(value = "/initparam1", method = RequestMethod.POST)
public void initparam1(@RequestParam(value = "val") String val) {
    this.str = val;
}

@PostMapping(value = "/initparam2/{val}")
public void initparam2(@PathVariable String val) {
    this.str = val;
}

@RequestMapping("/getparam1")
@ResponseBody
public String getParam1() {
    return this.str;
}
}
Run Code Online (Sandbox Code Playgroud)

java spring spring-annotations spring-boot

8
推荐指数
1
解决办法
1万
查看次数

Spring boot中@Entity和@Table之间的区别。我们两者都需要吗?

我们需要模型类的两个注释吗?@Entity 和 @Table 有什么区别

@Entity
@Table(name = "widget") // do we need this??
public class WidgetEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  private String clientName;
}
Run Code Online (Sandbox Code Playgroud)

java spring spring-annotations

8
推荐指数
1
解决办法
7320
查看次数