我有一个spring应用程序配置类,其中实例bean.
应用类:
@Configuration
@EnableAspectJAutoProxy
@EnableSpringDataWebSupport
@EnableTransactionManagement
@ComponentScan(basePackageClasses = Application.class)
@PropertySource(value = {"classpath:foo.properties"})
@EnableJpaRepositories(basePackageClasses = Application.class)
@EnableJpaAuditing
public class Application {
@Inject
private Environment env;
@Bean
JndiTemplate jndiTemplate() {
return new JndiTemplate();
}
@Bean
public DataSource dataSource() {
DataSource dataSource = getDataSource();
if (dataSource == null) {
dataSource = new BasicDataSource();
((BasicDataSource) dataSource).setUsername(env.getProperty("jdbc.user"));
((BasicDataSource) dataSource).setPassword(env.getProperty("jdbc.password""));
((BasicDataSource) dataSource).setDriverClassName(env.getProperty("jdbc.driverClassName"));
((BasicDataSource) dataSource).setUrl(env.getProperty("jdbc.url"));
}
return dataSource;
}
@Bean
public PlatformTransactionManager transactionManager() {
EntityManagerFactory factory = entityManagerFactory().getObject();
return new JpaTransactionManager(factory);
}
//....
}
Run Code Online (Sandbox Code Playgroud)
MvcConfiguration类:
@Configuration
@ComponentScan(basePackageClasses …
Run Code Online (Sandbox Code Playgroud) 我有这个Spring MVC控制器:
@Controller
@RequestMapping(value = "/foo")
public class FooController {
@Inject
private FooService fooService;
@RequestMapping(value = "foo/new")
public final String add(final ModelMap model) {
model.addAttribute(fooService.createFoo());
return "foo/detail";
}
@RequestMapping(value = "foo/{id}")
public final String detail(final ModelMap model, @PathVariable long id) {
model.addAttribute(fooService.findById(id));
return "foo/detail";
}
@RequestMapping(value="foo/update", method=RequestMethod.POST)
public final String save(@Valid @ModelAttribute final Foo foo, final BindingResult result, final SessionStatus status,
final RedirectAttributes ra, final HttpServletRequest request) {
if (result.hasErrors()) {
return "foo/detail";
}
fooService.save(foo);
status.setComplete();
Message.success(ra, "message.ok");
return "redirect:foo/list"; …
Run Code Online (Sandbox Code Playgroud) 我有两个metas的视图(我使用的是thymeleaf):
<meta name="_csrf" th:content="${_csrf.token}" />
<meta name="_csrf_header" th:content="${_csrf.headerName}" />
Run Code Online (Sandbox Code Playgroud)
在我的测试控制器中,我这样做:
HttpSessionCsrfTokenRepository httpSessionCsrfTokenRepository = new HttpSessionCsrfTokenRepository();
CsrfToken csrfToken2 = httpSessionCsrfTokenRepository.generateToken(new MockHttpServletRequest());
CustomUser user = new CustomUser();
user.setName("foo");
user.setSurname("fooo");
List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
grantedAuthorities.add(new SimpleGrantedAuthority("role"));
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("foo", "fooo", grantedAuthorities);
token.setDetails(user);
MockHttpSession session = new MockHttpSession();
session.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, new MockSecurityContext(token));
session.setAttribute("_csrf", csrfToken2);
this.mockMvc.perform(post("/foo/update")
.param("param", "asdfasd")
....
.session(session)
)
.andExpect(view().name(("foo/detail"))).andExpect(model().hasErrors())
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,我收到此错误(未找到令牌或为空):
org.springframework.web.util.NestedServletException:请求处理失败; 嵌套异常是org.thymeleaf.exceptions.TemplateProcessingException:异常评估SpringEL表达: "_csrf.token"(布局/默认:4)在org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:979)在有机springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869)位于org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java)的javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 843)在org.springframework.mock.web.MockFilterChain的javax.servlet.http.HttpServlet.service(HttpServlet.java:790)的org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:65) $ ServletFilterProxy.doFilter(MockFilterChain.java:167)org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134)org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:144) )在es.xunta.amtega.axipro.web.controller.SolicitudeControllerSaveTest.testSaveValidator(Solicitu)deControllerSaveTest.java:144)sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java .lang.reflect.Method.invoke(Method.java:601)在org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:50)在org.junit.internal.runners.model.ReflectiveCallable.run( ReflectiveCallable.java:12)在org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)在org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)在org.junit org.springframework.test.context.junit4上的org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)中的.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) .statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)在org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:70)在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)在org.springframework.test.context.junit4 .SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:224)org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:83)at org.junit.runners.ParentRunner $ …
我正在尝试从应用程序spring的spring上下文中获取用户,如下所示:
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
Run Code Online (Sandbox Code Playgroud)
问题在于方法是异步的,带有注释@Async:
@Service
@Transactional
public class FooServiceImpl implements FooService {
@Async("asyncExecutor")
public void fooMethod(String bar) {
System.out.println("Foo: " + bar);
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
}
}
Run Code Online (Sandbox Code Playgroud)
问题在于异步方法在另一个上下文中的另一个线程中运行。我尝试使用SecurityContextDelegationAsyncTaskExecutor。用户将传播到异步方法,但是如果我注销,则异步方法中的用户为null。这是我的代码:
@Configuration
@EnableAsync
public class SpringAsyncConfig implements AsyncConfigurer {
@Override
@Bean(name = "asyncExecutor")
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setMaxPoolSize(1);
executor.setThreadGroupName("MyCustomExecutor");
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setBeanName("asyncExecutor");
executor.initialize();
return new DelegatingSecurityContextAsyncTaskExecutor(executor);
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new CustomAsyncExceptionHandler();
}
}
Run Code Online (Sandbox Code Playgroud)
我还使用了ThreadPoolTaskExecutor并通过“ MODE_INHERITABLETHREADLOCAL”设置了弹簧安全性的上下文。但是结果是一样的。如果我登录到应用程序,则用户不为null。如果未登录,则用户为null。我真的希望运行该方法的用户,而不是当前登录的用户。我的代码:
@Configuration
@EnableAsync
public class SpringAsyncConfig implements AsyncConfigurer …
Run Code Online (Sandbox Code Playgroud) 我有以下代码,这些代码具有相互依赖的几个异步调用(例如,调用可以是apis REST),最后处理所有结果。这是我的示例代码:
private void foo1(String uuid, Handler<AsyncResult<JsonObject>> aHandler) {
//call json api, for example
JsonObject foo1 = new JsonObject();
foo1.put("uuid", "foo1");
aHandler.handle(Future.succeededFuture(foo1));
}
private void foo2(String uuid, Handler<AsyncResult<JsonObject>> aHandler) {
//call json api, for example
JsonObject foo2 = new JsonObject();
foo2.put("uuid", "foo2");
aHandler.handle(Future.succeededFuture(foo2));
}
private void foo3(String uuid, Handler<AsyncResult<JsonObject>> aHandler) {
//call json api, for example
JsonObject foo3 = new JsonObject();
foo3.put("uuid", "foo3");
aHandler.handle(Future.succeededFuture(foo3));
}
private void doSomething(JsonObject result1, JsonObject result2, JsonObject result3, Handler<AsyncResult<JsonObject>> aHandler) {
JsonObject finalResult =new JsonObject(); …
Run Code Online (Sandbox Code Playgroud) 我在 java 常量中有一个文本,我想根据在生成工件时配置的 Maven 变量来替换该文本,方法如下:
public class FOO {
public static final String BASE = "/@FOO@";
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果我替换java代码,它就会被永远替换并且不再执行替换,所以如果我更改变量的值它没有效果:
<plugin>
<groupId>com.google.code.maven-replacer-plugin</groupId>
<artifactId>replacer</artifactId>
<version>1.5.3</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>replace</goal>
</goals>
</execution>
</executions>
<configuration>
<includes>
<include>${basedir}/src/main/java/com/my/package/Constants.java</include>
</includes>
<replacements>
<replacement>
<token>@FOO@</token>
<value>${my.custom.property}</value>
</replacement>
</replacements>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
我通过相反的过程解决了这个问题:
<plugin>
<groupId>com.google.code.maven-replacer-plugin</groupId>
<artifactId>replacer</artifactId>
<version>1.5.3</version>
<executions>
<execution>
<id>first-execution</id>
<phase>generate-sources</phase>
<goals>
<goal>replace</goal>
</goals>
<configuration>
<includes>
<include>${basedir}/src/main/java/com/my/package/Constants.java</include>
</includes>
<replacements>
<replacement>
<token>@FOO@</token>
<value>${my.custom.property}</value>
</replacement>
</replacements>
</configuration>
</execution>
<execution>
<id>second-execution</id>
<phase>prepare-package</phase>
<goals>
<goal>replace</goal>
</goals>
<configuration>
<includes>
<include>${basedir}/src/main/java/com/my/package/Constants.java</include>
</includes>
<replacements>
<replacement>
<token>${my.custom.property}</token>
<value>@FOO@</value> …
Run Code Online (Sandbox Code Playgroud) 我试图使用评论中的关键字来解决项目中的问题,但它不起作用。我已经通过命令行尝试了 SourceTree 和 git,结果是相同的。我尝试过以下选项:关闭#1、关闭#1 和修复#1。
例如:
git commit -am "close issue fixes #1"
Run Code Online (Sandbox Code Playgroud)
我在一个分支上工作,而不是在主干上工作。是否应该在 GitHub 存储库中配置某些内容?
我有一个自定义 ConstraintValidator:
@Component
public class FooValidator implements ConstraintValidator<FooAnnotation, String> {
@Inject
private FooRepository fooRepository;
@Override
public void initialize(FooAnnotation foo) {
}
@Override
public boolean isValid(String code, ConstraintValidatorContext context) {
Foo foo = fooRepository.findByCode(code);
//My code
}
}
Run Code Online (Sandbox Code Playgroud)
在我的 Junit 测试和 MockMVC 中,我调用了 url,但 fooRepository bean 验证器始终为 null。
如何将其注入我的测试控制器中?我尝试创建一个模拟存储库,但它也是空的。我的源码测试:
public class FooControllerTest {
@InjectMocks
private FooController fooController;
private MockMvc mockMvc;
@Before
public void setup() {
// Process mock annotations
MockitoAnnotations.initMocks(this);
// Setup Spring test in standalone mode
this.mockMvc = MockMvcBuilders.standaloneSetup(fooController)
.setCustomArgumentResolvers(new …
Run Code Online (Sandbox Code Playgroud) 我正在尝试添加具有空值的列表管理,具有空值的结果必须保留在最后。在SQL查询中以两种不同的方式将选项添加到Order类,但是什么也没有出现。我使用的是Oracle,如果默认情况下从管理数据库启动的咨询具有空值结果,则将其列出。
这是我的代码:
List<Order> orders = new ArrayList<Order>();
orders.add(new Order(Direction.DESC, "points"));
//THIS
orders.add(new Order(Direction.DESC, "person.date", NullHandling.NULLS_LAST));
//OR THIS
orders.add(new Order(Direction.DESC, "person.date").nullsLast());
//NOT WORKING
orders.add(new Order(Direction.DESC, "id"));
List<Foo> foos = fooRepository.findAll(new Sort(orders));
Run Code Online (Sandbox Code Playgroud)
如何指定空结果应该结尾?
我正在开发一个使用来自 MQTT 主题的消息的程序,我的目标是可以异步使用和处理多个消息。
我正在使用 eclipse 客户端: https://www.eclipse.org/paho/files/javadoc/org/eclipse/paho/client/mqttv3/MqttClient.html https://www.eclipse.org/paho/files/ javadoc/org/eclipse/paho/client/mqttv3/MqttAsyncClient.html
问题是多个消息不是同时处理的,它们都在同一个线程中执行。我不太明白使用 MqttClient 和 MqttAsyncClient 之间的区别。javadoc 说:
Mqtt客户端
轻量级客户端,用于使用阻塞方法与 MQTT 服务器通信,直至操作完成。
Mqtt异步客户端
轻量级客户端,用于使用非阻塞方法与 MQTT 服务器通信,允许操作在后台运行。
我也不太清楚使用方法“subscribe”或“setCallback”之间的区别。只有通过“subscribe”你才能声明多个Listener:setCallback
设置回调侦听器以用于异步发生的事件。订阅 订阅主题...
它已尝试同时发送十条消息。我的测试如下:
public class FooListener implements IMqttMessageListener {
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
System.out.println("Thread [ " + Thread.currentThread().getName() +
"], Topic[ "+ topic + "], Message [" + message +"] ");
}
}
public class FooCallbackListener implements MqttCallback {
@Override
public void connectionLost(Throwable e) {
e.printStackTrace();
}
@Override
public void …
Run Code Online (Sandbox Code Playgroud)