标签: spring-web

在 Spring Rest CompletableFuture 结果上使用 @Transactional

在我当前的 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 …

spring spring-transactions spring-data-jpa spring-web

5
推荐指数
0
解决办法
1249
查看次数

.proprties 文件中的反斜杠 (\) 被 Spring 的“环境”变量忽略

@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)

但它仍然只是忽略值字符串中的 \ 。另外,我不能使用正斜杠代替反斜杠。

你能帮我修复它吗?提前致谢!!

java spring spring-annotations spring-web

5
推荐指数
1
解决办法
8912
查看次数

使用 RestTemplate 进行部分 JSON 检索

我正在使用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)

spring json get resttemplate spring-web

5
推荐指数
1
解决办法
1328
查看次数

How to set a context root for all @RestController in Spring Web MVC?

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 …

spring spring-mvc spring-boot spring-web

5
推荐指数
1
解决办法
1877
查看次数

Spring Boot REST MVC 将具有不同字段名称的请求参数映射到对象

假设我想将一堆请求参数捕获为一个对象,如下所示:

@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')在字段中添加,但没有成功。

spring-mvc http-request-parameters spring-web spring-rest

5
推荐指数
0
解决办法
2862
查看次数

SimpleClientHttpRequestFactory中的outputStreaming有什么用?

我正在使用OAuth2RestTemplatespring-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.

提前致谢!

java spring outputstream spring-security-oauth2 spring-web

5
推荐指数
0
解决办法
442
查看次数

Spring Boot 2 - 未找到 EmbeddedServletContainerFactory

我的 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)

java spring tomcat spring-boot spring-web

5
推荐指数
0
解决办法
1万
查看次数

使用属性占位符表达式将 String[] 从属性文件加载到 @CrossOrigin 的 origins 字段

在我的 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 来实现,使用@ValueList<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

5
推荐指数
1
解决办法
2535
查看次数

Spring Boot 将验证代码映射到 MessageSource 消息

问题:

我正在尝试使用尽可能多的 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

  • springBootVersion = '2.0.0.RELEASE'
  • 编译('org.springframework.boot:spring-boot-starter-web')

src/main/resources/messages.properties:

NotNull.user.firstName=This doesn't work
NotNull.firstName=Or …
Run Code Online (Sandbox Code Playgroud)

spring spring-mvc spring-boot spring-web

5
推荐指数
1
解决办法
4646
查看次数

使用 Spring 处理 RequestBody 上的 CSV

我需要根据请求接收 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?

java csv spring spring-boot spring-web

5
推荐指数
1
解决办法
4064
查看次数