我有一个弹簧控制器,它可以激活一个ApplicationEvent
@RestController
public class VehicleController {
@Autowired
private VehicleService service;
@Autowired
private ApplicationEventPublisher eventPublisher;
@RequestMapping(value = "/public/rest/vehicle/add", method = RequestMethod.POST)
public void addVehicle(@RequestBody @Valid Vehicle vehicle){
service.add(vehicle);
eventPublisher.publishEvent(new VehicleAddedEvent(vehicle));
}
}
Run Code Online (Sandbox Code Playgroud)
我对控制器进行了集成测试,例如
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = VehicleController.class,includeFilters = @ComponentScan.Filter(classes = EnableWebSecurity.class))
@Import(WebSecurityConfig.class)
public class VehicleControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private VehicleService vehicleService;
@Test
public void addVehicle() throws Exception {
Vehicle vehicle=new Vehicle();
vehicle.setMake("ABC");
ObjectMapper mapper=new ObjectMapper();
String s = mapper.writeValueAsString(vehicle);
given(vehicleService.add(vehicle)).willReturn(1);
mockMvc.perform(post("/public/rest/vehicle/add").contentType(
MediaType.APPLICATION_JSON).content(s))
.andExpect(status().isOk());
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我删除事件发布行,测试成功.但是,对于该事件,它会发生错误.
org.springframework.web.util.NestedServletException: Request …
Run Code Online (Sandbox Code Playgroud) 这是一个奇怪的问题,但是将变量定义为系统属性有什么优点,例如,
System.getProperty("files-dir", System.getProperty("user.home") + "/uploaded-files");
Run Code Online (Sandbox Code Playgroud)
在 Spring 应用程序属性中定义它。什么是更优选的?
我有一个spring rest mvc控制器,它有url"/ public/rest/vehicle/get".在我的安全配置中,我已经定义了对/ public/rest的任何请求都不应该要求身份验证.
http.
csrf().disable()
.authorizeRequests()
.antMatchers("/home/**", "/**", "/css/**", "/js/**", "/fonts/**", "/images/**", "/public/rest/**","/login*","/signin/**","/signup/**").permitAll()
.antMatchers("/property/**").authenticated()
.and()
.formLogin().loginPage("/login").permitAll()
.and().httpBasic().disable();
Run Code Online (Sandbox Code Playgroud)
当我启动我的应用程序并使用浏览器或任何其他方式提交请求时,此配置正常工作.现在,我有一个看起来像这样的测试类,
@RunWith(SpringRunner.class)
@WebMvcTest(VehicleController.class)
public class VehicleControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private VehicleService vehicleService;
@Test
public void getVehicle() throws Exception {
given(this.vehicleService.get(0)).
willReturn(new VehicleEquipmentDTO());
this.mockMvc.perform(get("/public/rest/vehicle/get").param("id","0"))
.andDo(print())
.andExpect(status().isOk());//.andExpect(content().string("Honda Civic"));
}}
Run Code Online (Sandbox Code Playgroud)
现在,当我运行这个测试时,它说
java.lang.AssertionError: Status
Expected :200
Actual :401
Run Code Online (Sandbox Code Playgroud)
当我打印请求响应时,我发现它因为安全性而抱怨."错误消息=访问此资源需要完全身份验证" 任何想法,为什么它不使用我的安全配置,以及强制它使用正确配置的工作是什么?提前致谢
在Spring Boot应用程序中,我有两个服务:GroupService和UserService。还有各自的模型类Group和User以及存储库。我将公开两个Rest端点,一个用于用户,一个用于组。现在,我有了一个端点,它将给定用户添加到给定组中,如下所示,现在忘记了可能的空检查和其他问题。
@PostMapping(path="groups/{group-id}/add/{user-id}")
public ResponseEntity<Group> setUserGroup(@PathVariable(value="group-id")Long groupId, @PathVariable(value="user-id")Long userId)
{ Group group=groupService.findById(groupId);
group.addUser(userService.findById(userId));
return new ResponseEntity<Group>(groupService.save(group),HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是,处理这种情况的最佳实践是什么。通过在组服务中注入用户服务来处理组服务中的逻辑,而不是在其余端点中处理它,这不是很好吗?在那种情况下,组服务将依赖于用户服务,但是如果(让我们想像这样的情况)多个其余端点需要,则至少可以重用该逻辑。
当前的实现具有优势,因为服务不会变得相互依赖。但是,如果我们具有复杂的逻辑,并且可以说我们具有复杂的事务,那么肯定没有合适的休息端点来处理它。请帮助我了解我应该使用哪种方法以及什么是行业最佳实践。
我正在尝试这个春天的JMS样本,它给出了错误.
https://spring.io/guides/gs/messaging-jms/
引起:org.springframework.jms.support.converter.MessageConversionException: Could not find type id property [_type] on message from destination [queue://mailbox]
有趣的是,如果我克隆它并运行一切运行正常.如果我复制并粘贴,则会出错.
@Bean // Serialize message content to json using TextMessage
public MessageConverter jacksonJmsMessageConverter() {
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
converter.setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName("_type");
return converter;
}
Run Code Online (Sandbox Code Playgroud)
这段代码实际上导致了错误.搜索网络和文档,我仍然不知道如何设置setTypeIdPropertyName值以及如何设置"_type"它在此项目中引用的内容?由于消息没有这样的属性,那么它来自哪里?
我的春季启动应用程序抛出连接超时错误,它永远无法连接.我看到的另一个有趣的问题是,它永远不会获取spring app属性中定义的连接超时属性.
org.springframework.amqp.AmqpTimeoutException: java.util.concurrent.TimeoutException
at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:74) ~[spring-rabbit-1.6.7.RELEASE.jar:na]
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:309) ~[spring-rabbit-1.6.7.RELEASE.jar:na]
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:577) ~[spring-rabbit-1.6.7.RELEASE.jar:na]
at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:1431) ~[spring-rabbit-1.6.7.RELEASE.jar:na]
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1412) ~[spring-rabbit-1.6.7.RELEASE.jar:na]
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1388) ~[spring-rabbit-1.6.7.RELEASE.jar:na]
at org.springframework.amqp.rabbit.core.RabbitAdmin.getQueueProperties(RabbitAdmin.java:336) ~[spring-rabbit-1.6.7.RELEASE.jar:na]
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.redeclareElementsIfNecessary(SimpleMessageListenerContainer.java:1123) [spring-rabbit-1.6.7.RELEASE.jar:na]
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$800(SimpleMessageListenerContainer.java:98) [spring-rabbit-1.6.7.RELEASE.jar:na]
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1329) [spring-rabbit-1.6.7.RELEASE.jar:na]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_91]
Caused by: java.util.concurrent.TimeoutException: null
at com.rabbitmq.utility.BlockingCell.get(BlockingCell.java:76) ~[amqp-client-3.6.5.jar:na]
at com.rabbitmq.utility.BlockingCell.uninterruptibleGet(BlockingCell.java:110) ~[amqp-client-3.6.5.jar:na]
at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36) ~[amqp-client-3.6.5.jar:na]
at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:366) ~[amqp-client-3.6.5.jar:na]
at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:292) ~[amqp-client-3.6.5.jar:na]
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:824) ~[amqp-client-3.6.5.jar:na]
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:736) ~[amqp-client-3.6.5.jar:na]
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:293) ~[spring-rabbit-1.6.7.RELEASE.jar:na]
... 9 common frames omitted
Run Code Online (Sandbox Code Playgroud)
这是我的java配置,
@Configuration
@EnableRabbit
public class RabbitConfig {
private final String …
Run Code Online (Sandbox Code Playgroud) 今天,我遇到了这个奇怪的面试问题.java库中的以下哪个类没有实现设计模式?
有人有线索吗?我怀疑问题的正确性,但想知道社区意见.如果有一些我不知道的事情,因为没有一个选项有意义.