Skip to content

Commit 5e604de

Browse files
committed
Mark HtmxView as deprecated in favor of HTML Fragments support in Spring Framework 6.2
See https://docs.spring.io/spring-framework/reference/web/webmvc-view/mvc-fragments.html
1 parent 28e2f07 commit 5e604de

File tree

4 files changed

+9
-80
lines changed

4 files changed

+9
-80
lines changed

htmx-spring-boot/src/main/java/io/github/wimdeblauwe/htmx/spring/boot/mvc/HtmxMvcAutoConfiguration.java

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,45 +2,29 @@
22

33
import com.fasterxml.jackson.databind.ObjectMapper;
44
import com.fasterxml.jackson.databind.json.JsonMapper;
5-
import org.springframework.beans.factory.ObjectFactory;
6-
import org.springframework.beans.factory.annotation.Qualifier;
75
import org.springframework.boot.autoconfigure.AutoConfiguration;
86
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
97
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
108
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
119
import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;
1210
import org.springframework.context.annotation.Bean;
1311
import org.springframework.core.Ordered;
14-
import org.springframework.util.Assert;
1512
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
1613
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
17-
import org.springframework.web.servlet.LocaleResolver;
1814
import org.springframework.web.servlet.View;
19-
import org.springframework.web.servlet.ViewResolver;
2015
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
21-
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
2216
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
2317
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
24-
import org.springframework.web.servlet.view.BeanNameViewResolver;
2518

2619
import java.util.List;
2720

2821
@AutoConfiguration
2922
@ConditionalOnWebApplication
3023
public class HtmxMvcAutoConfiguration implements WebMvcRegistrations, WebMvcConfigurer {
3124

32-
private final ObjectFactory<ViewResolver> viewResolverObjectFactory;
33-
private final ObjectFactory<LocaleResolver> localeResolverObjectFactory;
3425
private final ObjectMapper objectMapper;
3526

36-
HtmxMvcAutoConfiguration(@Qualifier("viewResolver") ObjectFactory<ViewResolver> viewResolverObjectFactory,
37-
ObjectFactory<LocaleResolver> localeResolverObjectFactory) {
38-
39-
Assert.notNull(viewResolverObjectFactory, "viewResolverObjectFactory must not be null!");
40-
Assert.notNull(localeResolverObjectFactory, "localeResolverObjectFactory must not be null!");
41-
42-
this.viewResolverObjectFactory = viewResolverObjectFactory;
43-
this.localeResolverObjectFactory = localeResolverObjectFactory;
27+
HtmxMvcAutoConfiguration() {
4428
this.objectMapper = JsonMapper.builder().build();
4529
}
4630

@@ -62,7 +46,7 @@ public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers)
6246

6347
@Override
6448
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
65-
handlers.add(new HtmxViewMethodReturnValueHandler(viewResolverObjectFactory.getObject(), localeResolverObjectFactory.getObject()));
49+
handlers.add(new HtmxViewMethodReturnValueHandler());
6650
}
6751

6852
@Bean

htmx-spring-boot/src/main/java/io/github/wimdeblauwe/htmx/spring/boot/mvc/HtmxResponse.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22

33
import org.springframework.util.Assert;
44

5-
import java.util.Collection;
6-
import java.util.LinkedHashSet;
7-
import java.util.Set;
5+
import java.util.*;
86

97
/**
108
* A holder for htmx-related response headers that can be used as method argument in controllers.

htmx-spring-boot/src/main/java/io/github/wimdeblauwe/htmx/spring/boot/mvc/HtmxView.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
* this class.
1818
*
1919
* @since 3.6.0
20+
* @deprecated since 4.0.0 for removal in 4.1.0 in favor of <a href="https://docs.spring.io/spring-framework/reference/web/webmvc-view/mvc-fragments.html">HTML Fragments</a> support.
2021
*/
22+
@Deprecated
2123
public class HtmxView {
2224

2325
private final Set<ModelAndView> views = new LinkedHashSet<>();
Lines changed: 4 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,20 @@
11
package io.github.wimdeblauwe.htmx.spring.boot.mvc;
22

3-
import com.fasterxml.jackson.core.JsonProcessingException;
4-
import jakarta.servlet.http.HttpServletRequest;
5-
import jakarta.servlet.http.HttpServletResponse;
6-
import org.springframework.context.i18n.LocaleContextHolder;
73
import org.springframework.core.MethodParameter;
8-
import org.springframework.lang.Nullable;
9-
import org.springframework.ui.ModelMap;
10-
import org.springframework.util.Assert;
11-
import org.springframework.util.CollectionUtils;
124
import org.springframework.web.context.request.NativeWebRequest;
135
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
146
import org.springframework.web.method.support.ModelAndViewContainer;
15-
import org.springframework.web.servlet.LocaleResolver;
16-
import org.springframework.web.servlet.ModelAndView;
17-
import org.springframework.web.servlet.View;
18-
import org.springframework.web.servlet.ViewResolver;
19-
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
20-
import org.springframework.web.util.ContentCachingResponseWrapper;
21-
22-
import java.util.Collection;
23-
import java.util.HashMap;
24-
import java.util.Locale;
25-
import java.util.Map;
26-
import java.util.stream.Collectors;
7+
import org.springframework.web.servlet.view.FragmentsRendering;
278

289
/**
2910
* Handles return values that are of type {@link HtmxView}.
3011
*
3112
* @since 3.6.0
13+
* @deprecated since 4.0.0 for removal in 4.1.0 in favor of <a href="https://docs.spring.io/spring-framework/reference/web/webmvc-view/mvc-fragments.html">HTML Fragments</a> support.
3214
*/
15+
@Deprecated
3316
public class HtmxViewMethodReturnValueHandler implements HandlerMethodReturnValueHandler {
3417

35-
private final ViewResolver viewResolver;
36-
private final LocaleResolver localeResolver;
37-
38-
public HtmxViewMethodReturnValueHandler(ViewResolver viewResolver, LocaleResolver localeResolver) {
39-
this.viewResolver = viewResolver;
40-
this.localeResolver = localeResolver;
41-
}
42-
4318
@Override
4419
public boolean supportsReturnType(MethodParameter returnType) {
4520
return HtmxView.class.isAssignableFrom(returnType.getParameterType());
@@ -52,40 +27,10 @@ public void handleReturnValue(Object returnValue,
5227
NativeWebRequest webRequest) throws Exception {
5328

5429
if (returnValue instanceof HtmxView htmxView) {
55-
mavContainer.setView(toView(htmxView));
30+
mavContainer.setView(FragmentsRendering.with(htmxView.getViews()).build());
5631
} else if (returnValue != null) {
5732
throw new UnsupportedOperationException("Unexpected return type: " + returnType.getParameterType().getName() + " in method: " + returnType.getMethod());
5833
}
5934
}
6035

61-
private View toView(HtmxView htmxView) {
62-
63-
return (model, request, response) -> {
64-
Locale locale = localeResolver.resolveLocale(request);
65-
ContentCachingResponseWrapper wrapper = new ContentCachingResponseWrapper(response);
66-
67-
for (ModelAndView mav : htmxView.getViews()) {
68-
View view;
69-
if (mav.isReference()) {
70-
view = viewResolver.resolveViewName(mav.getViewName(), locale);
71-
if (view == null) {
72-
throw new IllegalArgumentException("Could not resolve view with name '" + mav.getViewName() + "'.");
73-
}
74-
} else {
75-
view = mav.getView();
76-
}
77-
78-
for (String key : model.keySet()) {
79-
if (!mav.getModel().containsKey(key)) {
80-
mav.getModel().put(key, model.get(key));
81-
}
82-
}
83-
84-
view.render(mav.getModel(), request, wrapper);
85-
}
86-
87-
wrapper.copyBodyToResponse();
88-
};
89-
}
90-
9136
}

0 commit comments

Comments
 (0)