我使用 Java 11 并希望将 LocalDate/LocalDateTime 序列化/反序列化为字符串。好的。我添加了依赖:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${jackson.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
和模块:
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper()
.registerModule(new JavaTimeModule())
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
}
Run Code Online (Sandbox Code Playgroud)
当我将日期发送到我的应用程序时,它会正确反序列化:
{"profileId":12608,"birthDate":"2008-03-20","relativeType":"SON","cohabitants":true}
Run Code Online (Sandbox Code Playgroud)
当我直接使用 objectMapper 作为 bean 时,它也可以正确序列化:
{"code":"SUCCESS","id":868,"profileId":12608,"birthDate":"2008-03-20","relativeType":"SON","cohabitants":true}
Run Code Online (Sandbox Code Playgroud)
但是当它与控制器序列化时,它序列化为数组:
{"code":"SUCCESS","id":868,"profileId":12608,"birthDate":[2008,3,20],"relativeType":"SON","cohabitants":true}
Run Code Online (Sandbox Code Playgroud)
问题是在控制器上反序列化正文中的日期。控制器是:
@PostMapping
public Relative create(@Validated(Validation.Create.class) @RequestBody Relative relative) {
return service.create(relative);
}
Run Code Online (Sandbox Code Playgroud)
相对类:
@Getter
@Setter
@ToString(callSuper = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Relative extends MortgageResponse {
@Null(groups = Validation.Create.class)
@NotNull(groups = Validation.Update.class)
private Long id;
@NotNull
private Long profileId;
private LocalDate birthDate;
private RelativeType relativeType; …
Run Code Online (Sandbox Code Playgroud) 我用龙目岛。前段时间在构建项目时,编译器开始发出以下消息:
找到 slf4j-api 依赖项,但未找到提供程序。您是要添加 slf4j-simple 吗?请参阅https://www.slf4j.org/codes.html#noProviders 。
如果你点击链接,会有一个相当模糊的评论:
当在类路径上找不到 SLF4J 提供程序时,将报告此警告(即不是错误)消息。将 slf4j-nop.jar、slf4j-simple.jar、slf4j-log4j12.jar、slf4j-jdk14.jar 或 logback-classic.jar 中的一个(并且只有一个)放在类路径上应该可以解决问题。请注意,这些提供程序必须针对 slf4j-api 1.8 或更高版本。
在没有提供者的情况下,SLF4J 将默认为无操作 (NOP) 记录器提供者。
请注意 slf4j-api 版本 1.8.x 及更高版本使用 ServiceLoader 机制。早期版本依赖于 slf4j-api 不再支持的静态绑定器机制。请阅读常见问题条目 SLF4J 1.8.0 版有何变化?了解更多重要细节。
如果您负责打包应用程序并且不关心日志记录,那么将 slf4j-nop.jar 放在您的应用程序的类路径中将消除此警告消息。请注意,诸如库或框架之类的嵌入式组件不应声明对任何 SLF4J 提供程序的依赖,而应仅依赖于 slf4j-api。当一个库声明对 SLF4J 提供者的编译时依赖时,它会将该提供者强加给最终用户,从而否定 SLF4J 的目的。
我不知道如何正确地做到这一点。如果你有经验,请告诉我怎么做。
我有这个结构:
if (Objects.isNull(user.getMartialStatus())) {
user.setMartialStatus(MartialStatus.MARRIED);
}
Run Code Online (Sandbox Code Playgroud)
我有很多,我想使用函数式接口优化代码。好的。我写这样的东西:
public static <T> void processIfNull(T o, Supplier<Void> s) {
if (Objects.isNull(o)) {
s.get();
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我等待这段代码可以工作:
processIfNull(user.getMartialStatus(), () -> user.setMartialStatus(MartialStatus.MARRIED));
Run Code Online (Sandbox Code Playgroud)
但 IDEA 写道:
void 与 Void 不兼容
请告诉我该怎么办。
我写了拦截器:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("[pre-handle] method: {}\tURL: {}", request.getMethod(), request.getRequestURL());
if (HttpMethod.POST.name().equals(request.getMethod())) {
log.info(request.getReader().lines().collect(Collectors.joining()));
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试调用控制器时,会抛出异常:
java.lang.IllegalStateException:在当前请求已调用 getReader() 后无法调用 getInputStream()
据我了解, getReader() 调用关闭 InputStream 并且没有任何内容到达控制器。如何修复它?
我将Log4j2添加到项目中,并添加了config。
# Root logger option
log4j.rootLogger=INFO, file, stdout
# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:\\logging.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Run Code Online (Sandbox Code Playgroud)
然后,我记录如下代码:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
...
final static Logger logger = LogManager.getLogger(AbstractEditor.class);
...
logger.info("updated: " + entity);
logger.debug("==> debug");
logger.info("==> info");
logger.warn("==> warn");
logger.error("==> error");
logger.fatal("==> fatal");
logger.trace("==> trace");
Run Code Online (Sandbox Code Playgroud)
据我了解,所有级别高于DEBUG的日志都必须写入控制台和文件。但只有这个被打印到控制台:
15:08:52.285 [http-nio-8080-exec-1] ERROR ru.example.AbstractEditor - ==> error
15:08:52.292 …
Run Code Online (Sandbox Code Playgroud) 我尝试使用 gretty 运行项目。它抛出异常:
10:47:39 WARN Failed startup of context o.a.g.JettyWebAppContext@52045dbe{/,file:/C:/IdeaProjects/example-tab/build/inplaceWebapp/,STARTING}
java.lang.RuntimeException: Error scanning entry module-info.class from jar file:/C:/Users/user1/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.10.0/fec5797a55b786184a537abd39c3fa1449d752d6/log4j-api-2.10.0.jar
at org.eclipse.jetty.annotations.AnnotationParser.parseJar(AnnotationParser.java:913) ~[jetty-annotations-9.2.24.v20180105.jar:9.2.24.v20180105]
at org.eclipse.jetty.annotations.AnnotationParser.parse(AnnotationParser.java:831) ~[jetty-annotations-9.2.24.v20180105.jar:9.2.24.v20180105]
at org.eclipse.jetty.annotations.AnnotationConfiguration$ParserTask.call(AnnotationConfiguration.java:164) ~[jetty-annotations-9.2.24.v20180105.jar:9.2.24.v20180105]
at org.eclipse.jetty.annotations.AnnotationConfiguration$1.run(AnnotationConfiguration.java:549) ~[jetty-annotations-9.2.24.v20180105.jar:9.2.24.v20180105]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) ~[jetty-util-9.2.24.v20180105.jar:9.2.24.v20180105]
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) ~[jetty-util-9.2.24.v20180105.jar:9.2.24.v20180105]
at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_171]
Caused by: java.lang.UnsupportedOperationException: null
at org.objectweb.asm.ClassVisitor.visitModule(ClassVisitor.java:129) ~[asm-6.1.1.jar:na]
at org.objectweb.asm.ClassReader.readModule(ClassReader.java:667) ~[asm-6.1.1.jar:na]
at org.objectweb.asm.ClassReader.accept(ClassReader.java:503) ~[asm-6.1.1.jar:na]
at org.objectweb.asm.ClassReader.accept(ClassReader.java:355) ~[asm-6.1.1.jar:na]
at org.eclipse.jetty.annotations.AnnotationParser.scanClass(AnnotationParser.java:974) ~[jetty-annotations-9.2.24.v20180105.jar:9.2.24.v20180105]
at org.eclipse.jetty.annotations.AnnotationParser.parseJarEntry(AnnotationParser.java:956) ~[jetty-annotations-9.2.24.v20180105.jar:9.2.24.v20180105]
at org.eclipse.jetty.annotations.AnnotationParser.parseJar(AnnotationParser.java:909) ~[jetty-annotations-9.2.24.v20180105.jar:9.2.24.v20180105]
... 6 common frames omitted
Run Code Online (Sandbox Code Playgroud)
等级:
plugins {
id 'java'
id 'war'
id "org.gretty" version "2.2.0" …
Run Code Online (Sandbox Code Playgroud) 我写了 Grid,如示例所示。
public class MainView extends VerticalLayout {
private final UserService userService;
private Label label;
private Grid<UserDto> grid;
public MainView(UserService userService) {
this.userService = userService;
initComponents(userService);
}
private void initComponents(UserService userService) {
initMainGrid(userService);
}
private void initMainGrid(UserService userService) {
grid = new Grid<>(UserDto.class);
grid.setItems(userService.getAll());
grid.addColumn(UserDto::getId).setHeader("ID");
grid.addColumn(UserDto::getUsername).setHeader("??? ????????????");
grid.addColumn(UserDto::getPassword).setHeader("??????");
grid.addColumn(UserDto::getEmail).setHeader("email");
grid.addColumn(UserDto::getPhone).setHeader("???????");
grid.addColumn(UserDto::getActive).setHeader("???????");
add(grid);
}
}
Run Code Online (Sandbox Code Playgroud)
但数据重复:
正如我们所见,数据显示了两次。
请指教,有什么问题吗?如何解决?
我有一个 PDF 模板并试图替换其中的一些单词。我使用这个代码:
private PDDocument replaceText(PDDocument document, String searchString, String replacement) throws IOException {
if (searchString.isEmpty() || replacement.isEmpty()) {
return document;
}
PDPageTree pages = document.getDocumentCatalog().getPages();
for (PDPage page : pages) {
PDFStreamParser parser = new PDFStreamParser(page);
parser.parse();
List<Object> tokens = parser.getTokens();
for (int j = 0; j < tokens.size(); j++) {
Object next = tokens.get(j);
if (next instanceof Operator) {
Operator op = (Operator) next;
//Tj and TJ are the two operators that display strings in a PDF
if …
Run Code Online (Sandbox Code Playgroud) 在请求中发送之前,我需要检查 JWT 令牌。但是我没有生成这个令牌,我只是通过授权重新接收它,比,我没有秘密。
我用io.jsonwebtoken.jjwt
图书馆。
如何使用此库检查令牌到期时间?