在我当前的 Web 应用程序中,我对所有服务使用 @RestController 和 CompletableFuture 结果。
数据库操作是异步的(CompletableFuture 方法),但我只想在发送结果之前提交操作
我想在--save--异步结束后提交数据库修改(--save--是未来业务的列表)
@RestController
public class MyController {
...
@RequestMappping(...)
public CompletableFuture<ResponseEntity<AnyResource>> service(...){
CompletableFuture ...
.thenCompose(--check--)
.thenAsync(--save--)
...ect
.thenApply(
return ResponseEntity.ok().body(theResource);
);
}
}
Run Code Online (Sandbox Code Playgroud)
-> 我试过@Transactional,但它不起作用(在方法结束时提交但异步方法部分或未执行
-> 程序化的其他方式:
@RequestMappping(...)
public CompletableFuture<ResponseEntity<AnyResource>> service(...){
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
// explicitly setting the transaction name is something that can only be done programmatically
def.setName("SomeTxName");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = this.platformTransactionManager.getTransaction(def);
CompletableFuture ...
.thenCompose(--check--)
.thenAsync(--save--)
...ect
.thenApply(
this.platformTransactionManager.commit(status)
return ResponseEntity.ok().body(theResource);
);
}
Run Code Online (Sandbox Code Playgroud)
发生错误“无法停用事务同步 - 未激活”,推测是因为不是同一线程。
有没有正确的方法,将事务性与 CompletableFuture …
@Configuration我正在尝试使用@PropertySource和变量在 Spring java 类中加载 config.proprties 文件数据Environment。
示例:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/PropertySource.html 问题是,我有一个属性,其值如下:
serverName = abc\xyz
Run Code Online (Sandbox Code Playgroud)
当我使用方法读取这个属性时,
String server= env.getProprty("serverName");
System.out.print(server);
Run Code Online (Sandbox Code Playgroud)
值打印为“abcxyz”。
请注意,我尝试使用双反斜杠,例如
serverName = abc\\xyz
Run Code Online (Sandbox Code Playgroud)
但它仍然只是忽略值字符串中的 \ 。另外,我不能使用正斜杠代替反斜杠。
你能帮我修复它吗?提前致谢!!
我正在使用Spring RestTemplate发送GET request到第三方服务。它返回JSON代表 a 的巨大list of some entities。但是每个实体都非常大,并且包含大量不必要的数据。我只需要从每个实体中获取三个字段。我怎样才能建立我的模型来实现它?例如,如果我们有这个JSON:
{
"entity1": "foo",
"entity2": "bar",
"entity3": "...",
"entity4": {
"aaa": "...",
"bbb": "...",
"ccc": 5
},
"entity5": [
"...",
"..."
]
}, {
"entity1": "foo",
"entity2": "bar",
"entity3": "...",
"entity4": {
"aaa": "...",
"bbb": "...",
"ccc": 5
},
"entity5": [
"...",
"..."
]
}
Run Code Online (Sandbox Code Playgroud)
我有一堂课:
public class SomeModel implements Serializable {
private static final long serialVersionUID = 1L;
private Long entity1;
private …Run Code Online (Sandbox Code Playgroud) I'm looking to define /api as the root context for all my @RestControllers and don't want to specify it for each of them.
For instance, I would like to write @RestController("/clients") instead of @RestController("/api/clients") and make my request mappings available at /api/clients but have my static resources (in /main/resources/static) still served at /**.
So, setting server.servlet.contextPath=/api in application.properties is not a solution for my use case because the static resources will be served at /api, which …
假设我想将一堆请求参数捕获为一个对象,如下所示:
@GetMapping("/")
public List<Item> filterItems(@Valid Filter filter){}
Run Code Online (Sandbox Code Playgroud)
类Filter看起来像这样:
class Filter {
public String status;
public String start;
public String end;
}
Run Code Online (Sandbox Code Playgroud)
现在在 API 中请求参数名称state不再是status这样了?state=A&start=1&end=2。如何使这些请求参数映射到我的 Filter 对象而无需重命名status?我知道如果我有@RequestParam("state") String status它会起作用,但我希望它成为请求对象的一部分。
我尝试@JsonProperty('state')在字段中添加,但没有成功。
我正在使用OAuth2RestTemplate类spring-security-oauth2-2.1.1.RELEASE休息客户服务。理想情况下,每当访问令牌过期时,模板应通过获取新的访问令牌来重试失败的请求。但有时,当访问令牌在发布请求上过期时,模板会退出并出现以下错误:
org.springframework.web.client.ResourceAccessException:“REQUEST-URL”的 POST 请求上的 I/O 错误:由于服务器身份验证,在流模式下无法重试;嵌套异常是 java.net.HttpRetryException: 由于服务器身份验证无法重试,在流模式下
搜索后,我知道这种行为是由于outputStreaming变量 of造成的SimpleClientHttpRequestFactory,默认情况下设置为 true。我试图将此变量设置为 false 并且一切正常。但是我不知道如果将outputStreaming变量设置为 false会发生什么。所以我试图理解它的目的,它帮助我决定是否应该继续禁用outputStreaming.
提前致谢!
我的 Spring Boot 2 Web 应用程序运行良好,但现在我想将所有 http 请求重定向到 https。
但是 EmbeddedServletContainerFactory 和 TomcatEmbeddedServletContainerFactory 不能被导入。它说org.springframework.boot.context.embedded不存在。
我的代码如下:
@Bean
public EmbeddedServletContainerFactory servletContainer(){
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(redirectConnector());
return tomcat;
}
Run Code Online (Sandbox Code Playgroud)
我使用gradle,构建文件是:
buildscript {
ext {
springBootVersion = '2.0.0.M6'
}
repositories {
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
} …Run Code Online (Sandbox Code Playgroud) 在我的 Spring Boot 应用程序中,我有以下控制器
@RestController(value = "ProjectController")
@CrossOrigin(origins = {"${app.api.settings.cross-origin.urls}"})
public class ProjectController {
// some request mapping methods
}
Run Code Online (Sandbox Code Playgroud)
该属性已经是一个键,在application.properties文件app.api.settings.cross-origin.urls中具有逗号分隔的有效 url,例如
app.api.settings.cross-origin.urls=http://localhost:3000, http://localhost:7070
这种方法一直有效,直到我只有单个值,例如
app.api.settings.cross-origin.urls=http://localhost:3000但不适用于逗号分隔值。origins里面的字段的@CrossOrigin类型String[]仍然不会String[]自动转换。我的意思是框架应该提供某种方法来实现这一点。不是解决办法。我可以使用属性文件中的逗号分隔的 url 来实现,使用@Value到List<String>或String[]作为类内的字段,@Configuration如下所示
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Value("${app.api.settings.cross-origin.urls}")
private String[] consumerUiOrigins;
@Override
public void addCorsMappings(CorsRegistry registry) {
registry
.addMapping("/api/**")
.allowedOrigins(consumerUiOrigins);
}
}
Run Code Online (Sandbox Code Playgroud)
但这将是具有应用程序广泛适用性的全局配置。我想坚持使用更细粒度的@CrossOrigin基于注释的 CORS 配置。
所以我在下面清楚地提出了我的问题。
是否可以使用属性plcaholer表达式()将属性文件中的逗号分隔值注入具有相同类型的spring注释字段,即?????? …
spring spring-boot spring-web property-placeholder application.properties
问题:
我正在尝试使用尽可能多的 Spring Boot Auto-configuration 来减少样板代码。我无法让 Spring 验证代码自动映射到我的外部化 messages.properties。只有当我添加自己的LocalValidatorFactoryBean并使用完全限定的 javax 约束消息时,它才会起作用。
目标
我想重写defaultMessage为 @ javax.validation.constraints.NotNull全球在我的应用程序基于Spring输入验证码秒。
我做的第一件事就是注册这个 bean...我真的必须注册吗?我看到 Spring Boot 有一个,但它似乎与 messages.properties 无关。
@Bean
public LocalValidatorFactoryBean validator(MessageSource messageSource) {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource);
return bean;
}
Run Code Online (Sandbox Code Playgroud)
下一个让我很惊讶。Spring Validation 有这个漂亮的DefaultMessageCodesResolver,它为看起来像这样的失败提供了出色的代码策略:
"code": "NotNull",
"codes": [
"NotNull.user.firstName",
"NotNull.firstName",
"NotNull.java.lang.String",
"NotNull"
],
Run Code Online (Sandbox Code Playgroud)
但是这些代码甚至不考虑用于@NotNull 约束。验证转换的 spring 文档暗示这样的东西确实存在,但还没有任何有用的东西。
题
如何根据messages.properties 中的代码覆盖Spring Validation 错误的默认消息?
相关的build.gradle
src/main/resources/messages.properties:
NotNull.user.firstName=This doesn't work
NotNull.firstName=Or …Run Code Online (Sandbox Code Playgroud) 我需要根据请求接收 csv 文件并对其进行处理。
@PostMapping(value = "/csv", consumes = "text/csv")
public ViewObject postCsv(@RequestBody InputStream request){
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
但是当我执行时:
curl -X POST -H 'Content-Type: text/csv' -d @input.csv http://localhost:8080/csv
Run Code Online (Sandbox Code Playgroud)
这是我的控制台上显示的内容:
Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'text/csv;charset=UTF-8' not supported]
Run Code Online (Sandbox Code Playgroud)
Spring首先说我的请求无效。
那么,问题是:如何正确接收这个csv?
spring-web ×10
spring ×9
spring-boot ×5
java ×4
spring-mvc ×3
csv ×1
get ×1
json ×1
outputstream ×1
resttemplate ×1
spring-rest ×1
tomcat ×1