我正在与Spring引导应用程序中的Micro建立相互通信关系。响应以JSON格式生成,并使用logback.xml登录日志文件。这是进一步的杠杆在麋鹿方面与坞-maven插件。在执行mvn清洁安装时,它会在通过pom.xml创建docker映像时抛出异常。
错误堆栈:
由: com.spotify.docker.client.exceptions.DockerException: com.spotify.docker.client.shaded.com.fasterxml.jackson.core.JsonParseException:非法字符引起的
((CHAR,代码0)):只有规则的空白(\r,\n,\t)在Source:(File)的令牌之间被允许;线: 1,专栏:2 com.spotify.docker.client.auth.ConfigFileRegistryAuthSupplier.authForBuild (ConfigFileRegistryAuthSupplier.java:108) at com.spotify.docker.client.auth.MultiRegistryAuthSupplier.authForBuild (MultiRegistryAuthSupplier.java:77) at com.spotify.docker.client.DefaultDockerClient.build (DefaultDockerClient.java:1483) at com.spotify.docker.client.DefaultDockerClient.build (DefaultDockerClient.java:1460) at com.spotify.plugin.dockerfile.BuildMojo.buildImage (BuildMojo.java:240) at com.spotify.plugin.dockerfile.BuildMojo.execute (BuildMojo.java:135 )( com.spotify.plugin.dockerfile.AbstractDockerMojo.tryExecute (AbstractDockerMojo.java:265) at com.spotify.plugin.dockerfile.AbstractDockerMojo.execute (AbstractDockerMojo.java:254) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
pom.xml:
<!-- Dockerfile from Spotify -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.11</version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
</configuration>
<executions>
<execution>
<id>default</id>
<phase>install</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>我调试了代码,发现了错误的原因。这是在下面高亮显示的行方法中造成的:
private List<Comment> findCommentsForFeed(Feeds feed) {
log.info("Finding comments of feed with id {}", feed.getId());
String url = UriComponentsBuilder.fromHttpUrl(commentServiceBaseUrl).path("comments")
.queryParam("feedId", feed.getId()).toUriString();
// ** THIS LINE CAUSES ERROR... **
ResponseEntity<List<Comment>> response = restTemplate.exchange(url, HttpMethod.GET, null,
new ParameterizedTypeReference<List<Comment>>() {
});
List<Comment> comments = Objects.isNull(response.getBody()) ? new ArrayList<>() : response.getBody();
log.info("Found {} comment(s) of feed with id {}", comments.size(), feed.getId());
return comments;
}我的控制器看起来像:
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/feeds", produces = MediaType.APPLICATION_JSON_VALUE)
public class FeedController {
@Autowired
private final FeedService service;
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<Feeds>> getFeeds() {
List<Feeds> feeds = service.getFeeds();
return ResponseEntity.ok(feeds);
}
@GetMapping(path = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<FeedWithComment> getFeed(@PathVariable Long id) {
FeedWithComment feedWithComments = service.getFeed(id).orElseThrow(ResourceNotFoundException::new);
return ResponseEntity.ok(feedWithComments);
}用于json输出的logback.xml文件如下所示:
<springProfile name="docker">
<appender name="jsonConsoleAppender"
class="ch.qos.logback.core.ConsoleAppender">
<encoder
class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<version />
<logLevel />
<message />
<loggerName />
<threadName />
<context />
<pattern>
<omitEmptyFields>true</omitEmptyFields>
<pattern>
{
"trace": {
"trace_id": "%mdc{X-B3-TraceId}",
"span_id":
"%mdc{X-B3-SpanId}",
"parent_span_id": "%mdc{X-B3-ParentSpanId}",
"exportable": "%mdc{X-Span-Export}"
}
}
</pattern>
</pattern>
<mdc>
<excludeMdcKeyName>traceId</excludeMdcKeyName>
<excludeMdcKeyName>spanId</excludeMdcKeyName>
<excludeMdcKeyName>parentId</excludeMdcKeyName>
<excludeMdcKeyName>spanExportable</excludeMdcKeyName>
<excludeMdcKeyName>X-B3-TraceId</excludeMdcKeyName>
<excludeMdcKeyName>X-B3-SpanId</excludeMdcKeyName>
<excludeMdcKeyName>X-B3-ParentSpanId</excludeMdcKeyName>
<excludeMdcKeyName>X-Span-Export</excludeMdcKeyName>
</mdc>
<stackTrace />
</providers>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="jsonConsoleAppender" />
</root>
</springProfile>发布于 2020-09-08 05:28:29
我做了一些分析,发现问题是因为Spring版本。Springboot 2.3.0引入后,Spring的目录结构发生了变化。我使用的是Spring版本2.3.3。我对dockerfile做了一些修改,它起了作用。Maven对接插件成功地创建了图像。Dockerfile:
FROM adoptopenjdk/openjdk14 as builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract
FROM adoptopenjdk/openjdk14
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "-Dspring.profiles.active=docker", "org.springframework.boot.loader.JarLauncher"]https://stackoverflow.com/questions/63618494
复制相似问题