স্প্রিং এমভিসি পরীক্ষার সাথে কীভাবে "সার্কুলার ভিউ পাথ" ব্যতিক্রম এড়ানো যায়


117

আমার এক নিয়ন্ত্রণকারীর মধ্যে আমার নিম্নোক্ত কোড রয়েছে:

@Controller
@RequestMapping("/preference")
public class PreferenceController {

    @RequestMapping(method = RequestMethod.GET, produces = "text/html")
    public String preference() {
        return "preference";
    }
}

আমি স্প্রিং এমভিসি পরীক্ষার সাহায্যে এটি পরীক্ষা করার চেষ্টা করছি :

@ContextConfiguration
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class PreferenceControllerTest {

    @Autowired
    private WebApplicationContext ctx;

    private MockMvc mockMvc;
    @Before
    public void setup() {
        mockMvc = webAppContextSetup(ctx).build();
    }

    @Test
    public void circularViewPathIssue() throws Exception {
        mockMvc.perform(get("/preference"))
               .andDo(print());
    }
}

আমি নিম্নলিখিত ব্যতিক্রম পাচ্ছি:

বিজ্ঞপ্তি দর্শন পথ [অগ্রাধিকার]: আবার বর্তমান হ্যান্ডলার ইউআরএলে প্রেরণ করবে [/ পছন্দ] আপনার ভিউরসোলভার সেটআপ চেক করুন! (ইঙ্গিত: এটি কোনও অনির্দিষ্ট দৃশ্যের ফলাফল হতে পারে, ডিফল্ট দর্শন নাম উত্পন্ন হওয়ার কারণে)

আমি যেটি অদ্ভুত বোধ করি তা হ'ল আমি যখন "সম্পূর্ণ" প্রসঙ্গের কনফিগারেশনটি লোড করি তখন এতে টেমপ্লেট অন্তর্ভুক্ত থাকে এবং সমাধানগুলির সমাধান নীচে দেখানো হয়:

<bean class="org.thymeleaf.templateresolver.ServletContextTemplateResolver" id="webTemplateResolver">
    <property name="prefix" value="WEB-INF/web-templates/" />
    <property name="suffix" value=".html" />
    <property name="templateMode" value="HTML5" />
    <property name="characterEncoding" value="UTF-8" />
    <property name="order" value="2" />
    <property name="cacheable" value="false" />
</bean>

আমি ভালভাবে অবগত যে টেমপ্লেট রিসলভার দ্বারা যুক্ত করা উপসর্গটি নিশ্চিত করে যে অ্যাপ্লিকেশন যখন এই টেমপ্লেটটি সংশোধনকারী ব্যবহার করে তখন "বৃত্তাকার ভিউ পাথ" নেই।

তবে তারপরে আমার কীভাবে স্প্রিং এমভিসি পরীক্ষা ব্যবহার করে আমার অ্যাপটি পরীক্ষা করার কথা?


1
ViewResolverব্যর্থ হয়ে যাওয়ার পরে আপনি কী ব্যবহার করতে পারেন?
সোটিরিওস ডেলিমানলিস

@ সোতিরিওস ডেলিমনোলিস: আমি নিশ্চিত নই যে স্প্রিং এমভিসি টেস্ট দ্বারা কোনও ভিউরেসলভার ব্যবহার করা হয়েছে কিনা। ডকুমেন্টেশন
বলটিও

8
আমি একই সমস্যার মুখোমুখি হয়েছি কিন্তু সমস্যাটি হ'ল আমি নির্ভরতার নীচে যোগ করি নি। <d dependency> <groupId> org.springframework.boot </groupId> <artifactId> বসন্ত-বুট-স্টার্টার-থাইমালিফ </ b> আর্টিফ্যাক্ট আইডি> </d dependency>
আমির

@RestControllerপরিবর্তে ব্যবহার করুন@Controller
মোজেনরথ

উত্তর:


65

স্প্রিং এমভিসি পরীক্ষার সাথে এর কোনও যোগসূত্র নেই।

আপনি যখন কোনও ঘোষণা করেন না ViewResolver, স্প্রিং একটি ডিফল্ট রেজিস্ট্রেশন InternalResourceViewResolverকরে যা JstlViewরেন্ডারিংয়ের উদাহরণ তৈরি করে View

JstlViewবর্গ প্রসারিত InternalResourceViewযা

একই ওয়েব অ্যাপ্লিকেশনটির মধ্যে কোনও জেএসপি বা অন্যান্য সংস্থার জন্য আবরণ। অনুরোধের বৈশিষ্ট্য হিসাবে মডেল অবজেক্টগুলিকে উদ্ভাসিত করে এবং জাভ্যাক্স.সার্ভেলটি.রেকুয়েস্টডিসপ্যাচার ব্যবহার করে অনুরোধটিকে নির্দিষ্ট সংস্থান URL এ ফরোয়ার্ড করে।

এই দর্শনের জন্য একটি ইউআরএল অনুরোধডিসপ্যাচারের ফরোয়ার্ডের জন্য উপযুক্ত বা পদ্ধতি অন্তর্ভুক্ত করার জন্য ওয়েব অ্যাপ্লিকেশনটির মধ্যে এমন একটি উত্স নির্দিষ্ট করার কথা রয়েছে।

সাহসী আমার। অন্য শব্দে, ভিউ, রেন্ডারিংয়ের আগে, একটি পাওয়ার চেষ্টা করবেRequestDispatcher কোনটিforward() । এটি করার আগে এটি নিম্নলিখিতটি পরীক্ষা করে

if (path.startsWith("/") ? uri.equals(path) : uri.equals(StringUtils.applyRelativePath(uri, path))) {
    throw new ServletException("Circular view path [" + path + "]: would dispatch back " +
                        "to the current handler URL [" + uri + "] again. Check your ViewResolver setup! " +
                        "(Hint: This may be the result of an unspecified view, due to default view name generation.)");
}

কোথায় pathদেখার নামটি , আপনি কী থেকে ফিরে এসেছেন @Controller। এই উদাহরণে, যে preference। ভেরিয়েবল uriহ'ল অনুরোধটির ইউরি ধারণ করে যা হ'ল /context/preference

উপরের কোডটি বুঝতে পারে যে আপনি যদি ফরোয়ার্ড করতে চান /context/preferenceতবে একই সার্ভলেট (যেহেতু পূর্ববর্তী একই পরিচালনা করেছেন) অনুরোধটি পরিচালনা করবে এবং আপনি একটি অন্তহীন লুপে যাবেন।


যখন আপনি একটি ঘোষণা ThymeleafViewResolverএবং একটি ServletContextTemplateResolverএকটি নির্দিষ্ট সঙ্গে prefixএবং suffix, এটা তৈরী করেView ভিন্নভাবে, এটা মত একটি পথ দান

WEB-INF/web-templates/preference.html

ThymeleafView দৃষ্টান্তগুলি ফাইলের সাথে সম্পর্কিত হয় ServletContext এটিকে ব্যবহার পাথের ServletContextResourceResolver

templateInputStream = resourceResolver.getResourceAsStream(templateProcessingParameters, resourceName);`

যা শেষ পর্যন্ত

return servletContext.getResourceAsStream(resourceName);

এটি এমন একটি সংস্থান পায় যা ServletContextপথের সাথে সম্পর্কিত। এরপরে TemplateEngineএটি HTML তৈরি করতে ব্যবহার করতে পারে। এখানে অন্তহীন লুপটি ঘটতে পারে এমন কোনও উপায় নেই।


1
আপনার বিস্তারিত উত্তরের জন্য ধন্যবাদ। আমি বুঝতে পারি যে আমি যখন থাইমালিফ ব্যবহার করি তখন লুপটি কেন ঘটে না এবং আমি যখন থাইমালিফ ভিউ রিসলভারটি ব্যবহার করি না তখন কেন হয়। যাইহোক, আমি এখনও আমার কনফিগারেশনটি কীভাবে পরিবর্তন করব তা নিশ্চিত নই যাতে আমি আমার অ্যাপ্লিকেশনটি পরীক্ষা করতে পারি ...
বালটিও

1
@balteo যখন আপনি ব্যবহার করার জন্য একটি ফাইল আপেক্ষিক যেমন সমাধান করা এবং প্রদান। আপনি যখন সমাধানগুলি ব্যবহার করবেন না, তখন স্প্রিং একটি ডিফল্ট ব্যবহার করে যা এর সাথে সংস্থানগুলি খুঁজে পায় । এই সংস্থান হতে পারে একটি । এই ক্ষেত্রে এটি কারণ আপনার পথের মানচিত্রগুলি । ThymleafViewResolverViewprefixsuffixInternalResourceViewResolverRequestDispatcherServlet/preferenceDispatcherServlet
সোটিরিওস ডেলিমানলিস

2
@ বালতেও আপনার অ্যাপ্লিকেশন পরীক্ষা করতে একটি সঠিক সরবরাহ করুন ViewResolver। হয় ThymeleafViewResolverআপনার প্রশ্নের মতোই, আপনার নিজের কনফিগার করা InternalResourceViewResolverবা আপনি নিজের নিয়ামকটিতে ফিরে আসছেন এমন নামের পরিবর্তন করুন।
সোটিরিওস ডেলিমনোলিস

আপনাকে ধন্যবাদ, আপনাকে ধন্যবাদ আপনাকে ধন্যবাদ! আমি অন্তর্ভুক্ত করতে পারিনি কেন অভ্যন্তরীণ সংস্থান ভিউ রিসলভারটি "অন্তর্ভুক্ত" না করে আগে অগ্রাধিকার দেওয়া পছন্দ করেছিল তবে এখন আপনার ব্যাখ্যার সাথে মনে হচ্ছে নামটিতে "রিসোর্স" ব্যবহারটি কিছুটা অস্পষ্ট। এই ব্যাখ্যাটি স্টার্লার।
ক্রিস থম্পসন

2
@ শিরগিলফারহানআনসারি @RequestMappingএকটি Stringরিটার্ন টাইপের (এবং না @ResponseBody) সহ একটি এনোটেটেড হ্যান্ডলারের পদ্ধতিতে এর রিটার্নের মান হ'ল একটি স্ট্রিংকে ViewNameMethodReturnValueHandlerএকটি ভিউ নাম হিসাবে ব্যাখ্যা করে এবং আমার উত্তরটিতে আমি যে প্রক্রিয়াটি ব্যাখ্যা করি তার মধ্য দিয়ে এটি ব্যবহার করে। এর সাথে @ResponseBody, স্প্রিং এমভিসি পরিবর্তে এটি ব্যবহার করবে RequestResponseBodyMethodProcessorযা পরিবর্তে সরাসরি এইচটিটিপি প্রতিক্রিয়াতে স্ট্রিং লিখবে, অর্থাৎ। কোন দর্শন রেজোলিউশন।
সোটিরিওস ডেলিমনোলিস

97

আমি নীচের মত @ রেসপন্সবডি ব্যবহার করে এই সমস্যাটি সমাধান করেছি:

@RequestMapping(value = "/resturl", method = RequestMethod.GET, produces = {"application/json"})
    @ResponseStatus(HttpStatus.OK)
    @Transactional(value = "jpaTransactionManager")
    public @ResponseBody List<DomainObject> findByResourceID(@PathParam("resourceID") String resourceID) {

10
তারা কোনও দৃশ্যের সমাধান করে এইচটিএমএল ফিরিয়ে আনতে চায়, এর কোনও ক্রমিক সংস্করণটি ফেরত দেয় না List<DomainObject>
সোটিরিওস ডেলিমনোলিস

2
স্প্রিং বিশ্রাম ওয়েব পরিষেবার জন্য একটি জেএসএন প্রতিক্রিয়া ফিরিয়ে দেওয়ার সময় এটি আমার সমস্যার সমাধান করেছে
জো

ভাল, যদি আমি = application "অ্যাপ্লিকেশন / জেসন" produces উত্পাদন নির্দিষ্ট না করে, তবুও এটি কার্যকর হয়। এটি ডিফল্টভাবে জেসন উত্পাদন করে?
জয়

74

@Controller@RestController

আমার একই সমস্যা ছিল এবং আমি লক্ষ্য করেছি যে আমার কন্ট্রোলারটিও এর সাথে টিকা দেওয়া হয়েছিল @Controller@RestControllerসমস্যাটির সমাধানের সাথে এটি প্রতিস্থাপন করা । স্প্রিং ওয়েব এমভিসি থেকে ব্যাখ্যা এখানে :

@ রিস্টকন্ট্রোলার হ'ল একটি রচিত এনোটেশন যা নিজেই @ নিয়ন্ত্রণকারী এবং @ রেসপন্সবডি দ্বারা এমন একটি নিয়ামককে নির্দেশ করে যার প্রতিটি পদ্ধতি টাইপ-স্তরের @ রেসপোনসবডি টীকাটি উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং তাই সরাসরি প্রতিক্রিয়া বডিতে ভিউ রেজোলিউশন এবং একটি HTML টেমপ্লেটের সাথে রেন্ডারিংয়ে সরাসরি লিখে দেয়।


1
@ টডোরডোডরভ এটি আমার জন্য করেছেন
ইগোর রদ্রিগেজ

@ টডোরটডোরভ এবং আমার জন্য!
রান

3
আমার জন্যও কাজ করেছেন। আমার এতে @ControllerAdviceএকটি handleXyExceptionপদ্ধতি ছিল, যা রেসপন্সএন্টিটির পরিবর্তে আমার নিজস্ব বস্তুটি ফিরিয়ে দিয়েছে। টীকা @RestControllerশীর্ষে যুক্ত করা @ControllerAdviceকাজ করেছে এবং সমস্যাটি চলে গেছে।
ইগোর

36

এইভাবে আমি এই সমস্যাটি সমাধান করেছি:

@Before
    public void setup() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/jsp/view/");
        viewResolver.setSuffix(".jsp");

        mockMvc = MockMvcBuilders.standaloneSetup(new HelpController())
                                 .setViewResolvers(viewResolver)
                                 .build();
    }

1
এটি কেবল টেস্টকেসের জন্য। নিয়ন্ত্রকদের জন্য নয়।
cst1992

2
কাউকে তাদের নতুন ইউনিট পরীক্ষার মধ্যে এই সমস্যার সমাধানে সহায়তা করা ছিল, আমরা ঠিক এটিই খুঁজছিলাম।
Bradford2000

আমি এটি ব্যবহার করেছি, তবে পরীক্ষায় আমার রেজলভারটির জন্য ভুল উপসর্গ এবং প্রত্যয় দেওয়ার পরেও এটি কার্যকর হয়েছিল। আপনি কি এর পিছনে যুক্তি সরবরাহ করতে পারেন, এটি কেন প্রয়োজন?
দুশায়ন্তশু

এই উত্তরটি সবচেয়ে সঠিক এবং সুনির্দিষ্ট হওয়ার জন্য ভোট দেওয়া উচিত
ক্যাফিন কোডার

20

আমি একটি ওয়েবপৃষ্ঠা চেষ্টা করার জন্য এবং পরীক্ষার জন্য লোড করার জন্য স্প্রিং বুট ব্যবহার করছি, এবং এই সমস্যাটি ছিল। আমার সমাধান উপরের তুলনায় কিছুটা ভিন্ন পরিস্থিতি বিবেচনা করে কিছুটা আলাদা ছিল। (যদিও এই উত্তরগুলি আমাকে বুঝতে সাহায্য করেছে))

আমাকে কেবল মাভেনে আমার স্প্রিং বুট স্টার্টার নির্ভরতা পরিবর্তন করতে হয়েছিল:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
</dependency>

প্রতি:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

কেবলমাত্র 'ওয়েব' কে 'থাইমালিফ' এ পরিবর্তন করা আমার জন্য সমস্যাটি স্থির করেছে।


1
আমার জন্য, স্টার্টার-ওয়েবে পরিবর্তন করার প্রয়োজন ছিল না তবে আমার কাছে <scope> পরীক্ষা </ translation> থাইমেলিফ নির্ভরতা ছিল। আমি যখন "পরীক্ষার" সুযোগটি সরিয়ে ফেললাম তখন এটি কার্যকর হয়েছিল। ক্লু জন্য ধন্যবাদ!
জর্জিনা ডিয়াজ

16

আপনি যদি ভিউটি রেন্ডারিংয়ের বিষয়ে যত্নবান না হন তবে এখানে একটি সহজ ফিক্স।

অভ্যন্তরীণ রিসোর্সভিউরসোলভারের একটি সাবক্লাস তৈরি করুন যা বিজ্ঞপ্তি দর্শনীয় পথগুলি পরীক্ষা করে না:

public class StandaloneMvcTestViewResolver extends InternalResourceViewResolver {

    public StandaloneMvcTestViewResolver() {
        super();
    }

    @Override
    protected AbstractUrlBasedView buildView(final String viewName) throws Exception {
        final InternalResourceView view = (InternalResourceView) super.buildView(viewName);
        // prevent checking for circular view paths
        view.setPreventDispatchLoop(false);
        return view;
    }
}

তারপরে এটি দিয়ে আপনার পরীক্ষা সেট আপ করুন:

MockMvc mockMvc;

@Before
public void setUp() {
    final MyController controller = new MyController();

    mockMvc =
            MockMvcBuilders.standaloneSetup(controller)
                    .setViewResolvers(new StandaloneMvcTestViewResolver())
                    .build();
}

এটি আমার সমস্যা সমাধান করেছে। আমি পরীক্ষাগুলির একই ডিরেক্টরিতে একটি স্ট্যান্ডালোনএমভিসিস্টেস্ট ভিউ রিসোলভার ক্লাস যুক্ত করেছি এবং এটি উপরে বর্ণিত হিসাবে মকএমভিসিবাউিল্ডারে ব্যবহার করেছি। ধন্যবাদ
ম্যাথিউস আরাউজো

আমার একই সমস্যা ছিল এবং এটি এটি আমার জন্যও ঠিক করে দিয়েছে। অনেক ধন্যবাদ!
জোহান

এটি একটি দুর্দান্ত সমাধান যা (1) নিয়ামকগুলি পরিবর্তন করার প্রয়োজন হয় না এবং (2) প্রতি পরীক্ষার ক্লাসে প্রতি ক্লাসে একটি সাধারণ আমদানি সহ পুনরায় ব্যবহার করা যেতে পারে। +1
নন্দার স্পিডসট্রা

ওল্ডি কিন্তু গোল্ডি! আমার দিন বাঁচিয়েছে এই কাজের জন্য +1
রাইস্টলিন

13

যদি আপনি স্প্রিং বুট ব্যবহার করে থাকেন তবে আপনার পম.এক্সএমএলে থাইমালিফ নির্ভরতা যুক্ত করুন:

    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf-spring4</artifactId>
        <version>2.1.6.RELEASE</version>
    </dependency>

1
ভোট দিন। আমার প্রকল্পে এই ত্রুটিটি কারণ থাইমেলিফ নির্ভরতা হারিয়েছিল Miss তবে, আপনি যদি স্প্রিং বুট ব্যবহার করেন, তবে নির্ভরতা পরিবর্তে এর মতো দেখাবে:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
পেরের


8

আমার ক্ষেত্রে, আমি কোটলিন + স্প্রিং বুটটি চেষ্টা করছিলাম এবং আমি বৃত্তাকার ভিউ পাথ ইস্যুতে প্রবেশ করি। আমি অনলাইনে প্রাপ্ত সমস্ত পরামর্শগুলি নীচের চেষ্টা না করা পর্যন্ত সাহায্য করতে পারেনি:

মূলত আমি আমার কন্ট্রোলারটি ব্যবহার করে টিকা দিয়েছিলাম @Controller

import org.springframework.stereotype.Controller

আমি তখন প্রতিস্থাপিত @Controllerসঙ্গে@RestController

import org.springframework.web.bind.annotation.RestController

এবং এটা কাজ করে.


6

আপনি একটি @RequestBody ব্যবহার করেন নি এবং শুধুমাত্র ব্যবহার করা হয় @Controller, সহজ উপায় এই সমাধানের জন্য ব্যবহার করছে @RestControllerপরিবর্তে@Controller


এটি ঠিক করা হয়নি, এখন এটি আপনার ফাইলের নাম প্রদর্শন করবে, পরিবর্তে টেমপ্লেট প্রদর্শন করবে
আশীষ কাম্বলে

1
এটি প্রকৃত সমস্যার উপর নির্ভর করে। এই ত্রুটিটি অনেক কারণের কারণে ঘটতে পারে
মোজেনরথ

4

@ResponseBodyআপনার পদ্ধতির রিটার্নে টীকা যুক্ত করুন ।


কীভাবে এবং কেন এটি সমস্যার সমাধান করে তা আপনার পোস্টের গুণমান উন্নত করতে সত্যই সহায়তা করবে এবং সম্ভবত আরও বেশি ভোটের ফলস্বরূপ ফলাফল ব্যাখ্যা করুন Please
অ্যান্ড্রয়েড

3

আমি থাইমালিফ সহ স্প্রিং বুট ব্যবহার করছি। এটিই আমার পক্ষে কাজ করেছিল। সেখানে JSP সঙ্গে অনুরূপ উত্তর কিন্তু নোট যে আমি এইচটিএমএল, না JSP ব্যবহার করছি, আর এই ফোল্ডারে src/main/resources/templatesযেমন ব্যাখ্যা একটি প্রমিত স্প্রিং বুট প্রকল্পে মত এখানে । এটি আপনার ক্ষেত্রেও হতে পারে।

@InjectMocks
private MyController myController;

@Before
public void setup()
{
    MockitoAnnotations.initMocks(this);

    this.mockMvc = MockMvcBuilders.standaloneSetup(myController)
                    .setViewResolvers(viewResolver())
                    .build();
}

private ViewResolver viewResolver()
{
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();

    viewResolver.setPrefix("classpath:templates/");
    viewResolver.setSuffix(".html");

    return viewResolver;
}

আশাকরি এটা সাহায্য করবে.


3

পৃষ্ঠাটি উপস্থিত হলে স্প্রিং বুট + ফ্রিমার্কার চালানোর সময়:

হোয়াইটলেবেল ত্রুটি পৃষ্ঠা এই অ্যাপ্লিকেশনটিতে / ত্রুটির জন্য স্পষ্টভাবে ম্যাপিং নেই, তাই আপনি এটিকে ফ্যালব্যাক হিসাবে দেখছেন।

বসন্ত-বুট-স্টার্টার-প্যারেন্টে ২.২.১.আরল সংস্করণ ফ্রিমার্কার কাজ করে না:

  1. .ftl থেকে .ftlh এ ফ্রিমার্কার ফাইলগুলির নাম পরিবর্তন করুন
  2. অ্যাপ্লিকেশন.প্রেটিসগুলিতে যুক্ত করুন: বসন্ত.ফ্রিমার্কার.এক্সপোজ-অনুরোধ-গুণাবলী = সত্য

বসন্ত.ফ্রিমার্কার.সুফিক্স = .ফুটল


1
কেবলমাত্র .ফটল থেকে .ফ্টল ফ্রিমার্কার ফাইলগুলির নামকরণই আমার জন্য সমস্যার সমাধান করে।
জান্নিক

মানুষ ... আমি তোমার কাছে বিয়ার পাওনা এই নতুন নামকরণের কারণে আমি আমার পুরো দিনটি হারিয়েছি।
জুলিয়ানোব্র্যাসিল

2

থাইমালিফের জন্য:

আমি সবেমাত্র বসন্ত 4 এবং থাইমালিফ ব্যবহার শুরু করেছি, যখন আমি এই ত্রুটির মুখোমুখি হই তখন এটি যুক্ত করে সমাধান করা হয়েছিল:

<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
  <property name="templateEngine" ref="templateEngine" />
  <property name="order" value="0" />
</bean> 

1

@Controllerটীকাগুলি ব্যবহার করার সময় , আপনার প্রয়োজন @RequestMappingএবং @ResponseBodyটীকাগুলি। টিকা যোগ করার পরে আবার চেষ্টা করুন@ResponseBody


0

আমি স্প্রিং ওয়েব অ্যাপ্লিকেশনটি কনফিগার করতে টীকাগুলি ব্যবহার করি InternalResourceViewResolver, কনফিগারেশনে শিম যুক্ত করে সমস্যার সমাধান করা হয়েছে। আশা করি এটি সহায়ক হবে।

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.example.springmvc" })
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Bean
    public InternalResourceViewResolver internalResourceViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/jsp/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}

ধন্যবাদ এটি আমার জন্য ভাল কাজ করে। আমার অ্যাপ্লিকেশনটি 1.2.7 থেকে স্প্রিং বুট 1.3.1 এ আপগ্রেড করার পরে ভেঙে গেছে এবং কেবলমাত্র এই লাইনটিই রেজিস্ট্রি ব্যর্থ হয়েছিল adএডভিউকন্ট্রোলার ("/ লগইন")। সেটভিউনাম ("লগইন"); সেই শিমটি রেজিস্টার করার সময়, অ্যাপটি আবার কাজ করেছে ... কমপক্ষে লগইন হবে ডাব্লু।
le0diaz

0

এটি ঘটছে কারণ বসন্ত "পছন্দকে" সরিয়ে দিচ্ছে এবং আবার "অগ্রাধিকার" যুক্ত করছে যা অনুরোধটি উরির মতো একই পথ তৈরি করছে।

এরকম হচ্ছে: অনুরোধ উরি: "/ পছন্দ"

"পছন্দ" সরান: "/"

পাথ যুক্ত করুন: "/" + "পছন্দ"

শেষ স্ট্রিং: "/ পছন্দ"

এটি একটি লুপে উঠছে যা স্প্রিং আপনাকে ব্যতিক্রম ছুঁড়ে জানিয়ে দেয়।

"প্রিফারেন্সভিউ" বা আপনার পছন্দের যে কোনও পৃথক দর্শনের নাম দেওয়া আপনার পক্ষে এটি সর্বোত্তম।


0

আপনার গ্রেড ফাইলের উপর নির্ভরশীলতা ("org.springframework.boot: বসন্ত-বুট-স্টার্টার-থাইমেলিফ") যুক্ত করার চেষ্টা করুন hy থাইমালিফ ম্যাপিং দর্শনগুলিতে সহায়তা করে।


0

আমার ক্ষেত্রে, স্প্রিং বুট অ্যাপ্লিকেশনটি ব্যবহার করে জেএসপি পৃষ্ঠাগুলি পরিবেশন করার সময় আমার এই সমস্যা হয়েছিল।

আমার জন্য যা কাজ করেছে তা এখানে:

application.properties

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

pom.xml

জেএসপিগুলির জন্য সমর্থন সক্ষম করতে, আমাদের টমক্যাট-এম্বেড-জাপারের উপর নির্ভরতা যুক্ত করতে হবে।

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

-2

আর একটি সহজ পদ্ধতি:

package org.yourpackagename;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

      @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(PreferenceController.class);
        }


    public static void main(String[] args) {
        SpringApplication.run(PreferenceController.class, args);
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.