我目前正在尝试使用 swagger 核心来记录现有的 API。我使用swagger core 2.7和resteasy 3,因为我在wildfly 10上部署。我有一个war,其中包含我的rest servlet和一些位于耳朵中的模型类,其中也包含war。模型类使用 @Schema 进行注释,因此需要依赖于 swagger-annotations。我跟着教程https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Integration-and-configuration
所以我将依赖添加到我的战争的 pom.xml 和注释模块依赖添加到我的包含模型类的模块。它会编译和部署,但是当我浏览到 /myapp/openapi.yaml 时,我会在 Wildfly 控制台中看到我在 web.xml 中定义的每个资源的以下警告(战争中包含的资源除外)
12:52:22,058 警告 [io.swagger.v3.jaxrs2.integration.JaxrsAnnotationScanner](默认任务 5)从资源类加载类时出错:at.prismasolutions.test.render.RPlotFormatParam 来自 [Module "deployment.rserve-test. ear.at.prismasolutions.test.rserve.web-0.0.1-wildfly-SNAPSHOT.war:main”来自服务模块加载器]:java.lang.ClassNotFoundException:at.prismasolutions.test.render.RPlotFormatParam来自[模块“部署.rserve-test.ear.at.prismasolutions.test.rserve.web-0.0.1-wildfly-SNAPSHOT.war:main" from Service Module Loader] at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:198 ) 在 org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:363) 在 org.jboss.modules.ConcurrentClassLoader。performLoadClass(ConcurrentClassLoader.java:351) at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:93) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java: 264) 在 io.swagger.v3.jaxrs2.integration.JaxrsAnnotationScanner.classes(JaxrsAnnotationScanner.java:68) 在 io.swagger.v3.oas.integration.GenericOpenApiContext.read(GenericOpenApiContext.java:470) 在 io.swagger.v3 .jaxrs2.integration.resources.BaseOpenApiResource.getOpenApi(BaseOpenApiResource.java:49) 在 io.swagger.v3.jaxrs2.integration.resources.OpenApiResource.getOpenApi(OpenApiResource.java:32) 在 io.swagger.v3.jaxrs2.integration .resources.OpenApiResource$Proxy$_$$_WeldClientProxy.getOpenApi(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun。reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.jboss.resteasy .core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:139) at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:295) at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(:ResourceMethodInvoker.java) ) 在 …
我尝试在 Spring 中为 REST 服务控制器创建一个假客户端。
@PostMapping("/search")
public Page<MeasureDto> searchMeasures(@RequestBody MeasureDto example, Pageable pageable) {
...
}
Run Code Online (Sandbox Code Playgroud)
客户端看起来像这样:
@PostMapping("/search")
public Page<MeasureDto> searchMeasures(@RequestHeader("apiKey") String apiKey, @RequestBody MeasureDto example, Pageable pageable);
Run Code Online (Sandbox Code Playgroud)
运行测试时抛出以下异常:
引起原因:java.lang.IllegalStateException:方法有太多主体参数:公共抽象org.springframework.data.domain.Page com.foo.bar.jobservice.client.MeasureServiceClient.searchMeasures(java.lang.String,com.example .foo.jobservice.client.dto.MeasureDto,org.springframework.data.domain.Pageable)
我已经知道/尝试过的:
github上有一个已关闭的问题:https://github.com/spring-cloud/spring-cloud-netflix/issues/556
应该已经解决问题的提交问题:
https://github.com/spring-cloud/spring-cloud-openfeign/issues/26
提交:
我配置了什么:
import feign.codec.Encoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.cloud.openfeign.support.PageJacksonModule;
import org.springframework.cloud.openfeign.support.PageableSpringEncoder;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@EnableFeignClients
@Configuration
public class FeignConfig {
@Bean
public PageJacksonModule pageJacksonModule() {
return new PageJacksonModule();
}
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean …Run Code Online (Sandbox Code Playgroud) 我尝试使用 spring 数据 mongodb 存储库保存一个实体。我有一个级联保存的 EventListener。
问题是,我需要保存一个实体以获取其内部 id 并执行进一步的状态更改并在之后保存该实体。
@Test
void testUpdate() {
FooDto fooDto = getResource("/json/foo.json", new TypeReference<FooDto>() {
});
Foo foo = fooMapper.fromDTO(fooDto);
foo = fooService.save(foo);
log.info("Saved foo: " + foo);
foo.setState(FooState.Bar);
foo = fooService.save(foo);
log.info("Updated foo: " + foo);
}
Run Code Online (Sandbox Code Playgroud)
我有一个关于 foo 子集合的索引。它不会更新子项,但会尝试将它们插入两次,从而导致 org.springframework.dao.DuplicateKeyException。
为什么它不保存而是尝试再次插入?
有关的:
Spring Data MongoRepository 保存导致重复键错误
编辑:版本:
mongodb 4、spring boot 2.3.3.RELEASE
编辑更多细节:
存储库:
public interface FooRepository extends MongoRepository<Foo, String>
Run Code Online (Sandbox Code Playgroud)
实体:
@Document
public class Foo {
@Id
private String id;
private FooState state;
@DBRef …Run Code Online (Sandbox Code Playgroud) java ×2
spring ×2
spring-boot ×2
feign ×1
jakarta-ee ×1
mongodb ×1
openfeign ×1
resteasy ×1
swagger ×1
wildfly ×1