前几天我遇到了一个问题,其中一个@Valid注释被意外地从控制器类中删除了.不幸的是,它没有破坏我们的任何测试.我们的单元测试都没有实际运行Spring AnnotationMethodHandlerAdapter路径.我们直接测试我们的控制器类.
如果我的@MVC注释错误,我该如何编写一个正确失败的单元或集成测试?有没有办法我可以让Spring找到并使用MockHttpServlet查找和运用相关的控制器?
升级到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)
任何帮助深表感谢 …
我已经在 app类ComponentScan中使用注释,但是如果我仅使用此注释,它将在获取存储库引用时出现问题。因此,为了克服这个问题,我正在使用和注释。MainSpring BootEntityScanEnableJpaRepositoriescomponentScan
@EntityScan(basePackages={"com.gonkar.fleetms.models"})
@EnableJpaRepositories(basePackages={"com.gonkar.fleetms.repositories"})
Run Code Online (Sandbox Code Playgroud)
所以我的问题是为什么需要使用其他两个注释?如果我已经在使用@ComponentScan.
我有一个类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方法都使用相同的池
我有一个用作春豆的课程.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
我正在使用 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)
问题:如何使过滤器工作?
是否可以@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)
我可能不得不将此作为一个单独的问题提出。
我是 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实际是如何工作的 - 谁能解释一下?
在下面的例子中,我试图理解@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) 我们需要模型类的两个注释吗?@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 ×9
spring ×9
spring-boot ×4
cors ×1
java-8 ×1
jetty-9 ×1
spring-4 ×1
spring-io ×1
spring-mvc ×1
spring-test ×1
unit-testing ×1