我有一个 spring boot(版本 2.1.8.RELEASE)rest 应用程序,其中包含来自控制器的以下邮件功能:
@PostMapping(value = "/sendMail1")
public @ResponseBody EmailResponse sendMail1( @RequestBody EmailRequestDto emailRequestDto) {
if (checkAllEmailAddValid(emailRequestDto)) {
sendMailService.sendEmail(emailRequestDto);
//return new ResponseEntity<>("Mail has been sent successfully", HttpStatus.OK);
return new EmailResponse(HttpStatus.OK, "Mail has been sent successfully");
} else {
LOG.error("Email addresse provided is invalid");
//return new ResponseEntity<>("Email address provided is invalid", HttpStatus.BAD_REQUEST);
return new EmailResponse(HttpStatus.BAD_REQUEST, "Email address provided is invalid");
}
}
Run Code Online (Sandbox Code Playgroud)
为服务类发送邮件的方法是:
@Override
@Async("threadPoolExecutor")
public void sendEmail(EmailRequestDto emailRequestDto) {
LOG.debug("calling method sendMail");
...
}
Run Code Online (Sandbox Code Playgroud)
我已在我的计算机上部署了上述其余服务,并可通过 url( http://localhost:9090/email-service/email/sendMail1 ) 进行访问。但是,当我使用 …
您好,我有一个 Spring Boot 应用程序(2.3.1.RELEASE,ojdbc8),基本上它连接到 Oracle 数据库。
Spring Boot 应用程序在连接到 Oracle 数据库时启动 find。但是,当集成测试连接到 H2 嵌入式数据库时,它无法启动,并且我的一些查询失败并显示以下错误消息:
Caused by: java.lang.NullPointerException: null
at org.hibernate.hql.internal.NameGenerator.generateColumnNames(NameGenerator.java:27)
at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.generateColumnNames(SessionFactoryHelper.java:434)
Run Code Online (Sandbox Code Playgroud)
我设法通过在 application-test.yml 文件中添加以下代码行来使其工作:
spring:
jpa:
database-platform: org.hibernate.dialect.Oracle10gDialect
Run Code Online (Sandbox Code Playgroud)
请修改以下 application-test.yml 配置:
spring.datasource:
url: jdbc:h2:mem:db;Mode=Oracle;DB_CLOSE_DELAY=-1
username: sa
password: sa
driverClassName: org.h2.Driver
# added empty context path to override application.yml context path
server:
servlet:
contextPath:
spring:
jpa:
database-platform: org.hibernate.dialect.Oracle10gDialect
Run Code Online (Sandbox Code Playgroud)
应用程序启动良好并且集成成功完成,但是日志中可能会显示以下异常:
org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "ALL_SEQUENCES" not found; SQL statement:
select * from all_sequences [42102-200]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:453) ~[h2-1.4.200.jar:1.4.200]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200]
at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200] …
Run Code Online (Sandbox Code Playgroud) 我必须在 Spring Boot 中实现具有异步功能的方法:
我对注释异步的位置有点困惑,基本上我的休息控制器如下:
@RestController
@RequestMapping("/email")
public class EmailController {
public @ResponseBody ResponseEntity<String> sendMailCon(@RequestBody EmailRequestDto emailRequestDto) {
LOG.debug("calling method sendMail from controller ");
//do complex stuff
sendMailService.sendEmail(emailRequestDto);
return new ResponseEntity<>("Mail has been sent successfully", HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)
服务等级如下:
@Component
public class SendMailServiceImpl implements SendMailService {
private static final Logger LOG = LoggerFactory.getLogger(SendMailServiceImpl.class);
@Autowired
private JavaMailSender javaMailSender;
@Override
@Async("threadPoolExecutor")
public void sendEmail(EmailRequestDto emailRequestDto) {
LOG.debug("calling method sendMail do complex stuff");
...
}
Run Code Online (Sandbox Code Playgroud)
我的异步 bean 配置如下:
@EnableAsync
@Configuration
public class AsyncConfig { …
Run Code Online (Sandbox Code Playgroud) 我有一个带有 spring-data-mongodb (v3.0.0) 的 Spring boot (v2.3.0.RELEASE) 应用程序。
基本上,当我在文档中添加@Version注释时,当我尝试更新现有文档时应用程序会失败,代码如下:
我的文档如下:
@Id
private String paymentId;
private String transactionId;
private String transactionTypeCode;
@Version
private Integer version;
Run Code Online (Sandbox Code Playgroud)
我的存储库如下:
public interface PaymentRepository extends MongoRepository<Payment, String>, PaymentRepositoryCustom {
}
Run Code Online (Sandbox Code Playgroud)
更新失败的情况如下:
Optional<Payment> paymentSaved = Optional.ofNullable(paymentRepository.findMaxIdByRefer(request.getAdd().getRefer()));
populatePayment(paymentSaved, payment);
paymentRepository.save(payment);
public static void populatePayment( Optional<Payment> paymentSaved, Payment payment) {
if (paymentSaved.isPresent() && !ObjectUtils.isEmpty(payment)) {
payment.setTransactionId(paymentSaved.get().getTransactionId());
payment.setCreationDate(paymentSaved.get().getCreationDate());
payment.setPaymentId(paymentSaved.get().getPaymentId());
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序在paymentRepository.save(payment)
方法上失败,但出现以下异常:
org.springframework.dao.DuplicateKeyException: E11000 duplicate key error collection: test.payment index: _id_ dup key: { _id: ObjectId('627a35b7f1ea29549008487e') …
Run Code Online (Sandbox Code Playgroud) spring spring-data-jpa spring-data-mongodb spring-boot spring-mongodb
我是jpa和spring世界的新手,我目前正在对一个简单的方法进行一些单元测试,但只有当我在单元测试模式下运行我的测试类时才会收到此错误信息:
java.lang.IllegalStateException: No transactional EntityManager available
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:223)
at $Proxy19.unwrap(Unknown Source)
at com.gemstone.integration.PersonDao.getPersonByUserNamePassword(PersonDao.java:59)
at com.gemstone.integration.PersonDaoTest.getPersonByUserNamePassword_Exist(PersonDaoTest.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Run Code Online (Sandbox Code Playgroud)
但是,当我运行我的项目时,代码工作正常,它正确地检索数据(不在单元测试模式下).
请在下面找到我的方法,单元测试将基于:
@PersistenceContext
private EntityManager …
Run Code Online (Sandbox Code Playgroud) 我正在学习 AOP spring 并尝试一些例子。关于@AfterReturning,我所理解的是,仅当目标成功返回并且与切入点匹配时才会调用该方法。然而,在我的例子中,如下所示,我有一个切入点,它定义了仅返回字符串的所有方法,但它调用了所有 void 方法以及返回字符串的方法。
我的建议:
@AfterReturning(value= "execution(* com.aop..CustomerServiceImpl.*(..))",
returning= "string")
public void returnStringPointcut(JoinPoint joinPoint,String string){
System.out.println("logAfter() is running!");
System.out.println("String : " + string);
System.out.println("hijacked : " + joinPoint.getSignature().getName());
System.out.println("******");
}
Run Code Online (Sandbox Code Playgroud)
请在下面找到我的 Impl 类:
public void addCustomer() {
// TODO Auto-generated method stub
}
public String getCustomer() {
// TODO Auto-generated method stub
return "string";
}
public boolean deleteCustomer() {
// TODO Auto-generated method stub
return false;
}
public void addCustomerAppended() {
// TODO Auto-generated method stub
}
public …
Run Code Online (Sandbox Code Playgroud) 我正在使用spring(版本3.2.5)注释驱动的mvc应用程序,基本上我需要能够捕获任何错误的url到单个方法然后显示错误消息.例如,如果我正确url www.url.valid/login
映射到控制器,如果用户错误地插入loginw或任何无效的URL,它应映射到默认控制器.
我尝试过以下方式:
package com.controller;
import static com.mns.utils.Constants.REGISTER_FAIL;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class DefaultSpringController {
@RequestMapping
public String forwardRequest(final HttpServletRequest request) {
return "redirect:/" + REGISTER_FAIL;
}
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序上下文如下:
<!-- Default to DefaultSpringController -->
<bean id="defaultSpringController" class="com.controller.DefaultSpringController">
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="defaultHandler" ref="defaultSpringController"/>
</bean
Run Code Online (Sandbox Code Playgroud)
但不断收到以下错误:
nested exception is java.lang.ClassNotFoundException: com.controller.DefaultSpringController
Run Code Online (Sandbox Code Playgroud)
我不确定我在这里缺少什么,控制器是在正确的包中.
知道我怎么能实现它吗?
提前致谢
我有一个 spring boot 应用程序(版本 2.2.5.RELEASE),它打包为 jar 文件:
我正在使用 Freemarker(版本 2.3.29)生成 html 模板,请在下面找到我的配置:
@Configuration
public class EmailFreemarkerConfig {
@Primary
@Bean
public FreeMarkerConfigurationFactoryBean getFreeMarkerConfig() {
FreeMarkerConfigurationFactoryBean bean = new FreeMarkerConfigurationFactoryBean();
bean.setTemplateLoaderPath("/templates/");
return bean;
}
Run Code Online (Sandbox Code Playgroud)
请找到我的 pom.xml 文件,其中包含 ftl 文件扩展名:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.csv</include>
<include>**/*.vm</include>
<include>**/*.jpg</include>
<include>**/*.ftl</include>
</includes>
</resource>
</resources>
Run Code Online (Sandbox Code Playgroud)
当我打包 jar 时,我可以在以下路径找到该文件:BOOT-INF/classes/templates/file12.ftl
请在下面找到我生成 html 文件的代码:
@Autowired
private Configuration freemarkerConfig;
.....
try {
t = freemarkerConfig.getTemplate("file12.ftl");
html = FreeMarkerTemplateUtils.processTemplateIntoString(t, model);
} catch (IOException | TemplateException e) {
// TODO …
Run Code Online (Sandbox Code Playgroud) 我为java应用程序提供了以下Regex表达式:
[\+0-9]+([\s0-9]+)?
Run Code Online (Sandbox Code Playgroud)
如何将上述电话号码的表达限制为最少4位数,最多7位数?我认为这会像将{4,7}添加到表达式中但它不起作用.
有什么建议吗?
基本上我的电话号码可以以+号开头,后跟数字(+004 ......)或仅以数字(004 ......)开头,也可以在任意数字(0 0 4 ...)之间包含空格.
根据我在网上阅读的资源,@lazy 和范围原型都按需创建 bean,这与默认范围(单例)不同。那么什么时候适合使用@lazy而不是prototype,反之亦然,或者在定义类时一起使用它们呢?
提前致谢。
java ×8
spring ×5
spring-boot ×4
spring-test ×2
aop ×1
freemarker ×1
h2 ×1
jpa ×1
matcher ×1
regex ×1
spring-aop ×1
spring-async ×1
spring-batch ×1
spring-data ×1
spring-mvc ×1
spring-rest ×1