应用程序仅在新启动的服务器上工作

时间:2019-02-15 17:09:03

标签: java java-ee server glassfish payara

我有一个奇怪的问题。每当我重新启动服务器(Payara)并执行我的应用程序时,它就会按预期工作。它甚至可能在其他时间工作。但随后它仅抛出ResponseProcessingException
重新启动服务器后,它又可以工作1-2次。

StackTrace

javax.ws.rs.client.ResponseProcessingException: Unexpected error during response processing.
    at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:881)
    [...] // more ...
    at fish.payara.requesttracing.jaxrs.client.decorators.JaxrsInvocationBuilderDecorator.get(JaxrsInvocationBuilderDecorator.java:195)
    at com.classes.MyClass.myFunc(MyClass.java:10)
    [...] // more ...
Caused by: java.lang.IllegalArgumentException: argument type mismatch
    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.eclipse.yasson.internal.model.SetWithSetter.internalSetValue(SetWithSetter.java:27)
    at org.eclipse.yasson.internal.model.SetValueCommand.setValue(SetValueCommand.java:26)
    at org.eclipse.yasson.internal.model.ReflectionPropagation.setValue(ReflectionPropagation.java:67)
    at org.eclipse.yasson.internal.model.PropertyModel.setValue(PropertyModel.java:295)
    at org.eclipse.yasson.internal.serializer.ObjectDeserializer.lambda$getInstance$0(ObjectDeserializer.java:102)
    at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
    [...] // more ...

根据该StackTrace,该异常是由类myFunc中的函数MyClass的第十行引起的。

com.classes.MyClass.myFunc:

SomeObject myFunc(String str) {
    return ClientBuilder.newClient()
            .target(str)
            .request(MediaType.APPLICATION_JSON) // this line
            .get(SomeObject.class);
}

我认为我的代码是正确的,因为它起初似乎很有效。因此,服务器一定有什么问题吗?

我正在Netbeans 8.2上运行Payara 5。我也尝试过GlassFish 5。

更新1:

SomeObject.class

import java.time.LocalDate;
import java.time.LocalDateTime;
import javax.json.bind.annotation.JsonbDateFormat;
import static javax.json.bind.annotation.JsonbDateFormat.DEFAULT_FORMAT;
import javax.json.bind.annotation.JsonbTypeDeserializer;

public class SomeObject {

    private int num1;
    @JsonbTypeDeserializer(AnotherClassDeserializer.class)
    private AnotherClass anotherClass;
    @JsonbDateFormat(locale = DEFAULT_FORMAT)
    private LocalDateTime date1;
    @JsonbDateFormat(value = "yyyy-MM-dd")
    private LocalDate date2;
    @JsonbDateFormat(value = "yyyy-MM-dd")
    private LocalDate date3;
    private Boolean yesNo;
    private int num2;
    private int num3;

    // constructor
    // default constructor

    // getter & setter

}

更新2:

str是以下形式的URL:http://someUrl.com/rest/id/123

@JsonbDateFormat(locale = DEFAULT_FORMAT)@JsonbDateFormat(value = "yyyy-MM-ddTHH:mm:ss")相同。它似乎可以完美地解析。

1 个答案:

答案 0 :(得分:0)

可以打印或登录“ str”吗?然后查看控制台或搜索XXXXXX ...模式

JSON字段应与类匹配

SomeObject myFunc(String str) {
    System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXX" + str);  // or put a breakpoint   
    return ClientBuilder.newClient()
            .target(str)
            .request(MediaType.APPLICATION_JSON) // this line
            .get(SomeObject.class);
}

这个@JsonbDateFormat(locale = DEFAULT_FORMAT)非常有趣。你能看看这个模式是否匹配吗?