Skip to content

Commit

Permalink
Fixed bug in k-state for hmm break 'no transition'.
Browse files Browse the repository at this point in the history
Change-Id: Id6a3b7a7642f1552c7ea7ef9fd3c833a9f9a79fd
  • Loading branch information
Sebastian Mattheis committed Jan 3, 2018
1 parent eb16240 commit cd1b275
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 62 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.bmw-carit</groupId>
<artifactId>barefoot</artifactId>
<version>0.1.1</version>
<version>0.1.2</version>
<build>
<plugins>
<plugin>
Expand Down
49 changes: 25 additions & 24 deletions src/main/java/com/bmwcarit/barefoot/markov/KState.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import org.json.JSONException;
import org.json.JSONObject;

import com.bmwcarit.barefoot.util.Tuple;
import com.bmwcarit.barefoot.util.Triple;

/**
* <i>k</i>-State data structure for organizing state memory in HMM inference.
Expand All @@ -40,7 +40,7 @@ public class KState<C extends StateCandidate<C, T, S>, T extends StateTransition
extends StateMemory<C, T, S> {
private final int k;
private final long t;
private final LinkedList<Tuple<Set<C>, S>> sequence;
private final LinkedList<Triple<Set<C>, S, C>> sequence;
private final Map<C, Integer> counters;

/**
Expand Down Expand Up @@ -100,13 +100,15 @@ public KState(JSONObject json, Factory<C, T, S> factory) throws JSONException {
}

S sample = factory.sample(jsonseqelement.getJSONObject("sample"));
String kestid = jsonseqelement.getString("kestid");
C kestimate = candidates.get(kestid);

sequence.add(new Tuple<>(vector, sample));
sequence.add(new Triple<>(vector, sample, kestimate));
}

Collections.sort(sequence, new Comparator<Tuple<Set<C>, S>>() {
Collections.sort(sequence, new Comparator<Triple<Set<C>, S, C>>() {
@Override
public int compare(Tuple<Set<C>, S> left, Tuple<Set<C>, S> right) {
public int compare(Triple<Set<C>, S, C> left, Triple<Set<C>, S, C> right) {
if (left.two().time() < right.two().time()) {
return -1;
} else if (left.two().time() > right.two().time()) {
Expand Down Expand Up @@ -167,7 +169,7 @@ public S sample() {
*/
public List<S> samples() {
LinkedList<S> samples = new LinkedList<>();
for (Tuple<Set<C>, S> element : sequence) {
for (Triple<Set<C>, S, C> element : sequence) {
samples.add(element.two());
}
return samples;
Expand All @@ -183,6 +185,7 @@ public void update(Set<C> vector, S sample) {
throw new RuntimeException("out-of-order state update is prohibited");
}

C kestimate = null;
for (C candidate : vector) {
counters.put(candidate, 0);
if (candidate.predecessor() != null) {
Expand All @@ -192,16 +195,16 @@ public void update(Set<C> vector, S sample) {
}
counters.put(candidate.predecessor(), counters.get(candidate.predecessor()) + 1);
}
if (kestimate == null || candidate.seqprob() > kestimate.seqprob()) {
kestimate = candidate;
}
}

if (!sequence.isEmpty()) {
Triple<Set<C>, S, C> last = sequence.peekLast();
Set<C> deletes = new HashSet<>();
C estimate = null;

for (C candidate : sequence.peekLast().one()) {
if (estimate == null || candidate.seqprob() > estimate.seqprob()) {
estimate = candidate;
}
for (C candidate : last.one()) {
if (counters.get(candidate) == 0) {
deletes.add(candidate);
}
Expand All @@ -210,13 +213,13 @@ public void update(Set<C> vector, S sample) {
int size = sequence.peekLast().one().size();

for (C candidate : deletes) {
if (deletes.size() != size || candidate != estimate) {
if (deletes.size() != size || candidate != last.three()) {
remove(candidate, sequence.size() - 1);
}
}
}

sequence.add(new Tuple<>(vector, sample));
sequence.add(new Triple<>(vector, sample, kestimate));

while ((t > 0 && sample.time() - sequence.peekFirst().two().time() > t)
|| (k >= 0 && sequence.size() > k + 1)) {
Expand All @@ -234,6 +237,10 @@ public void update(Set<C> vector, S sample) {
}

protected void remove(C candidate, int index) {
if (sequence.get(index).three() == candidate) {
return;
}

Set<C> vector = sequence.get(index).one();
counters.remove(candidate);
vector.remove(candidate);
Expand Down Expand Up @@ -282,23 +289,16 @@ public List<C> sequence() {
return null;
}

C kestimate = null;

for (C candidate : sequence.peekLast().one()) {
if (kestimate == null || candidate.seqprob() > kestimate.seqprob()) {
kestimate = candidate;
}
}

C kestimate = sequence.peekLast().three();
LinkedList<C> ksequence = new LinkedList<>();

for (int i = sequence.size() - 1; i >= 0; --i) {
if (kestimate != null) {
ksequence.push(kestimate);
kestimate = kestimate.predecessor();
} else {
ksequence.push(sequence.get(i).one().iterator().next());
assert (sequence.get(i).one().size() == 1);
ksequence.push(sequence.get(i).three());
kestimate = sequence.get(i).three().predecessor();
}
}

Expand All @@ -309,7 +309,7 @@ public List<C> sequence() {
public JSONObject toJSON() throws JSONException {
JSONObject json = new JSONObject();
JSONArray jsonsequence = new JSONArray();
for (Tuple<Set<C>, S> element : sequence) {
for (Triple<Set<C>, S, C> element : sequence) {
JSONObject jsonseqelement = new JSONObject();
JSONArray jsonvector = new JSONArray();
for (C candidate : element.one()) {
Expand All @@ -321,6 +321,7 @@ public JSONObject toJSON() throws JSONException {
}
jsonseqelement.put("vector", jsonvector);
jsonseqelement.put("sample", element.two().toJSON());
jsonseqelement.put("kestid", element.three().id());
jsonsequence.put(jsonseqelement);
}

Expand Down
97 changes: 61 additions & 36 deletions src/test/java/com/bmwcarit/barefoot/markov/KStateTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,10 @@ public void TestKStateUnbound() {
elements.put(1, new MockElem(1, Math.log10(0.2), 0.2, null));
elements.put(2, new MockElem(2, Math.log10(0.5), 0.5, null));

KState<MockElem, StateTransition, Sample> state =
new KState<>();
KState<MockElem, StateTransition, Sample> state = new KState<>();
{
Set<MockElem> vector = new HashSet<>(
Arrays.asList(elements.get(0), elements.get(1), elements.get(2)));
Set<MockElem> vector =
new HashSet<>(Arrays.asList(elements.get(0), elements.get(1), elements.get(2)));

state.update(vector, new Sample(0));

Expand All @@ -90,8 +89,8 @@ public void TestKStateUnbound() {
elements.put(6, new MockElem(6, Math.log10(0.1), 0.1, elements.get(2)));

{
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(3),
elements.get(4), elements.get(5), elements.get(6)));
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(3), elements.get(4),
elements.get(5), elements.get(6)));

state.update(vector, new Sample(1));

Expand All @@ -110,8 +109,8 @@ public void TestKStateUnbound() {
elements.put(10, new MockElem(10, Math.log10(0.1), 0.1, elements.get(6)));

{
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(7),
elements.get(8), elements.get(9), elements.get(10)));
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(7), elements.get(8),
elements.get(9), elements.get(10)));

state.update(vector, new Sample(2));

Expand All @@ -130,12 +129,12 @@ public void TestKStateUnbound() {
elements.put(14, new MockElem(14, Math.log10(0.1), 0.1, null));

{
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(11),
elements.get(12), elements.get(13), elements.get(14)));
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(11), elements.get(12),
elements.get(13), elements.get(14)));

state.update(vector, new Sample(3));

assertEquals(7, state.size());
assertEquals(8, state.size());
assertEquals(13, state.estimate().numid());

List<Integer> sequence = new LinkedList<>(Arrays.asList(2, 6, 9, 13));
Expand All @@ -148,7 +147,7 @@ public void TestKStateUnbound() {

state.update(vector, new Sample(4));

assertEquals(7, state.size());
assertEquals(8, state.size());
assertEquals(13, state.estimate().numid());

List<Integer> sequence = new LinkedList<>(Arrays.asList(2, 6, 9, 13));
Expand All @@ -158,18 +157,47 @@ public void TestKStateUnbound() {
}
}

@Test
public void TestBreak() {
// Test k-state in case of HMM break 'no transition' as reported in barefoot issue #83.
// Tests only 'no transitions', no emissions is empty vector and, hence, input to update
// operation.

KState<MockElem, StateTransition, Sample> state = new KState<>();
Map<Integer, MockElem> elements = new HashMap<>();
elements.put(0, new MockElem(0, Math.log10(0.4), 0.4, null));
{
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(0)));
state.update(vector, new Sample(0));
}
elements.put(1, new MockElem(1, Math.log(0.7), 0.6, null));
elements.put(2, new MockElem(2, Math.log(0.3), 0.4, elements.get(0)));
{
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(1), elements.get(2)));
state.update(vector, new Sample(1));
}
elements.put(3, new MockElem(3, Math.log(0.5), 0.6, null));
{
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(3)));
state.update(vector, new Sample(2));
}
List<MockElem> seq = state.sequence();
assertEquals(seq.get(0).numid(), 0);
assertEquals(seq.get(1).numid(), 1);
assertEquals(seq.get(2).numid(), 3);
}

@Test
public void TestKState() {
Map<Integer, MockElem> elements = new HashMap<>();
elements.put(0, new MockElem(0, Math.log10(0.3), 0.3, null));
elements.put(1, new MockElem(1, Math.log10(0.2), 0.2, null));
elements.put(2, new MockElem(2, Math.log10(0.5), 0.5, null));

KState<MockElem, StateTransition, Sample> state =
new KState<>(1, -1);
KState<MockElem, StateTransition, Sample> state = new KState<>(1, -1);
{
Set<MockElem> vector = new HashSet<>(
Arrays.asList(elements.get(0), elements.get(1), elements.get(2)));
Set<MockElem> vector =
new HashSet<>(Arrays.asList(elements.get(0), elements.get(1), elements.get(2)));

state.update(vector, new Sample(0));

Expand All @@ -183,8 +211,8 @@ public void TestKState() {
elements.put(6, new MockElem(6, Math.log10(0.1), 0.1, elements.get(2)));

{
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(3),
elements.get(4), elements.get(5), elements.get(6)));
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(3), elements.get(4),
elements.get(5), elements.get(6)));

state.update(vector, new Sample(1));

Expand All @@ -203,8 +231,8 @@ public void TestKState() {
elements.put(10, new MockElem(10, Math.log10(0.1), 0.1, elements.get(6)));

{
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(7),
elements.get(8), elements.get(9), elements.get(10)));
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(7), elements.get(8),
elements.get(9), elements.get(10)));

state.update(vector, new Sample(2));

Expand All @@ -223,8 +251,8 @@ public void TestKState() {
elements.put(14, new MockElem(14, Math.log10(0.1), 0.1, null));

{
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(11),
elements.get(12), elements.get(13), elements.get(14)));
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(11), elements.get(12),
elements.get(13), elements.get(14)));

state.update(vector, new Sample(3));

Expand Down Expand Up @@ -258,11 +286,10 @@ public void TestTState() {
elements.put(1, new MockElem(1, Math.log10(0.2), 0.2, null));
elements.put(2, new MockElem(2, Math.log10(0.5), 0.5, null));

KState<MockElem, StateTransition, Sample> state =
new KState<>(-1, 1);
KState<MockElem, StateTransition, Sample> state = new KState<>(-1, 1);
{
Set<MockElem> vector = new HashSet<>(
Arrays.asList(elements.get(0), elements.get(1), elements.get(2)));
Set<MockElem> vector =
new HashSet<>(Arrays.asList(elements.get(0), elements.get(1), elements.get(2)));

state.update(vector, new Sample(0));

Expand All @@ -276,8 +303,8 @@ public void TestTState() {
elements.put(6, new MockElem(6, Math.log10(0.1), 0.1, elements.get(2)));

{
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(3),
elements.get(4), elements.get(5), elements.get(6)));
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(3), elements.get(4),
elements.get(5), elements.get(6)));

state.update(vector, new Sample(1));

Expand All @@ -296,8 +323,8 @@ public void TestTState() {
elements.put(10, new MockElem(10, Math.log10(0.1), 0.1, elements.get(6)));

{
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(7),
elements.get(8), elements.get(9), elements.get(10)));
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(7), elements.get(8),
elements.get(9), elements.get(10)));

state.update(vector, new Sample(2));

Expand All @@ -316,8 +343,8 @@ public void TestTState() {
elements.put(14, new MockElem(14, Math.log10(0.1), 0.1, null));

{
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(11),
elements.get(12), elements.get(13), elements.get(14)));
Set<MockElem> vector = new HashSet<>(Arrays.asList(elements.get(11), elements.get(12),
elements.get(13), elements.get(14)));

state.update(vector, new Sample(3));

Expand Down Expand Up @@ -348,8 +375,7 @@ public void TestTState() {
public void TestKStateJSON() throws JSONException {
Map<Integer, MockElem> elements = new HashMap<>();

KState<MockElem, StateTransition, Sample> state =
new KState<>(1, -1);
KState<MockElem, StateTransition, Sample> state = new KState<>(1, -1);

{
JSONObject json = state.toJSON();
Expand All @@ -361,8 +387,7 @@ public void TestKStateJSON() throws JSONException {
elements.put(2, new MockElem(2, Math.log10(0.5), 0.5, null));

state.update(
new HashSet<>(
Arrays.asList(elements.get(0), elements.get(1), elements.get(2))),
new HashSet<>(Arrays.asList(elements.get(0), elements.get(1), elements.get(2))),
new Sample(0));

{
Expand Down
2 changes: 1 addition & 1 deletion util/submit/batch.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@

tmp = "batch-%s" % random.randint(0, sys.maxint)
file = open(tmp, "w")
file.write("{\"format\": \"%s\", \"request\": %s}" % (options.format, json.dumps(samples)))
file.write("{\"format\": \"%s\", \"request\": %s}\n" % (options.format, json.dumps(samples)))
file.close()

subprocess.call("cat %s | netcat %s %s" % (tmp, options.host, options.port), shell=True)
Expand Down

1 comment on commit cd1b275

@russellhoff
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm suffering this same bug.

2020-08-27 08:06:22.901 INFO 22076 --- [http-nio-8181-exec-29] c.i.b.v.h.TripsData : Get 91 trip data FOUND.
2020-08-27 08:06:22.920 DEBUG 22076 --- [http-nio-8181-exec-29] c.b.b.m.Matcher : 34 (67) candidates
2020-08-27 08:06:22.928 INFO 22076 --- [http-nio-8181-exec-29] c.b.b.m.Filter : HMM break - no state transitions
2020-08-27 08:06:22.929 DEBUG 22076 --- [http-nio-8181-exec-29] o.j.s.OpenEntityManagerInViewInterceptor : Closing JPA EntityManager in OpenEntityManagerInViewInterceptor
2020-08-27 08:06:22.929 DEBUG 22076 --- [http-nio-8181-exec-29] o.s.w.s.DispatcherServlet : Failed to complete request: java.lang.RuntimeException: out-of-order state update is prohibited
2020-08-27 08:06:22.929 ERROR 22076 --- [http-nio-8181-exec-29] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/viaje/prod] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: out-of-order state update is prohibited] with root cause

java.lang.RuntimeException: out-of-order state update is prohibited
at com.bmwcarit.barefoot.markov.KState.update(KState.java:183) ~[barefoot-0.1.5.jar!/:?]
at com.ingartek.beretrack.viaje.service.MapMatchingService.match(MapMatchingService.java:222) ~[classes!/:1.0.0-M7]
at com.ingartek.beretrack.viaje.service.MainFacade.matchOnline(MainFacade.java:449) ~[classes!/:1.0.0-M7]
at com.ingartek.beretrack.viaje.rest.ViajeController.matchOnline(ViajeController.java:174) ~[classes!/:1.0.0-M7]
at com.ingartek.beretrack.viaje.rest.ViajeController$$FastClassBySpringCGLIB$$3cc14783.invoke() ~[classes!/:1.0.0-M7]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88) ~[spring-aop-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at com.ingartek.beretrack.viaje.aspect.LogExecutionTimeAspect.logExecutionTime(LogExecutionTimeAspect.java:19) ~[classes!/:1.0.0-M7]
at jdk.internal.reflect.GeneratedMethodAccessor206.invoke(Unknown Source) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644) ~[spring-aop-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633) ~[spring-aop-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) ~[spring-aop-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) ~[spring-aop-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95) ~[spring-aop-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at com.ingartek.beretrack.viaje.rest.ViajeController$$EnhancerBySpringCGLIB$$bb9bfd64.matchOnline() ~[classes!/:1.0.0-M7]
at jdk.internal.reflect.GeneratedMethodAccessor221.invoke(Unknown Source) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) ~[spring-webmvc-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) ~[spring-webmvc-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) ~[spring-webmvc-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.36.jar!/:9.0.36]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:93) ~[spring-boot-actuator-2.3.1.RELEASE.jar!/:2.3.1.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
at java.lang.Thread.run(Thread.java:834) [?:?]

Please sign in to comment.