3

私はこのように動作するURLを持っています:localhost/info

@Controller
@RequestMapping("/info")
public class VersionController {

   @RequestMapping(value = "", method = RequestMethod.GET)
   public @ResponseBody
   Map get() {
      loadProperties();
      Map<String, String> m = new HashMap<String, String>();
      m.put("buildTimestamp", properties.getProperty("Application-Build-Timestamp"));
      m.put("version", properties.getProperty("Application-Version"));
      return m;
   }

}

そして、アプリケーションの初期化時に他のマッピングを次のように登録します。

localhost/xxxx/info
localhost/yyyy/info
localhost/zzzz/info

これらのURLはすべて、と同じ応答を返しますlocalhost/info

アプリケーションのxxxx、yyyy部分は変更可能です。カスタムマッピングを次のように登録する必要があります

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("???").setViewName("???");
}

Buこれはビューに対してのみ機能します。

動的登録のアイデアはありますか?

4

6 に答える 6

4

URLパスのハンドラーを追加できる新しいHandlerMappingを登録できます。最も便利な実装はSimpleUrlHandlerMappingです。

これらのハンドラーを(で注釈が付けられたもののように)Beanメソッドにしたい場合は、それらをHandlerMethod@RequestMappingラッパーとして定義して、既に登録されているハンドラーがそれらを呼び出すようにする必要があります。RequestMappingHandlerAdapter

于 2013-03-19T13:26:57.580 に答える
4

Springの時点で5.0.M2、Springは、プログラムで「コントローラー」のような構造を作成できる機能的なWebフレームワークを提供しています。

この場合に行う必要があるのは、処理する必要のあるURLに対して適切なRouterFunctionを作成し、適切なHandlerFunctionを使用して要求を処理することです。

ただし、これらの構成はSpring MVCの一部ではなく、SpringReactiveの一部であることに注意してください。

詳細については、このブログ投稿を確認してください

于 2016-09-26T14:17:45.067 に答える
3

簡単な例は1000語以上の価値があると思います:)SpringBootでは次のようになります...

コントローラを定義します(ヘルスエンドポイントの例):

public class HealthController extends AbstractController {

    @Override
    protected ModelAndView handleRequestInternal(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response) {
        return new ModelAndView(new MappingJacksonSingleView(), "health", Health.up().build());
    }

}

そして、構成を作成します。

@Configuration
public class CustomHealthConfig {

    @Bean
    public HealthController healthController() {
        return new HealthController();
    }

    @Bean
    public SimpleUrlHandlerMapping simpleUrlHandlerMapping() {
        SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
        mapping.setOrder(Integer.MAX_VALUE - 2);
        mapping.setUrlMap(ImmutableMap.of("/health", healthController()));
        return mapping;
    }

}

ハンドラーの順序について-ここで理由を見てください:SimpleUrlHandlerMappingのJava構成(春のブート)

MappingJacksonSingleViewモデルとビューの単一のjson値を返すための補助クラスです。

public class MappingJacksonSingleView extends MappingJackson2JsonView {

    @Override
    @SuppressWarnings("unchecked")
    protected Object filterModel(Map<String, Object> model) {
        Object result = super.filterModel(model);
        if (!(result instanceof Map)) {
            return result;
        }

        Map map = (Map) result;
        if (map.size() == 1) {
            return map.values().toArray()[0];
        }
        return map;
    }

} 

ジャクソンシングルビューソース-このブログ投稿:https ://www.pascaldimassimo.com/2010/04/13/how-to-return-a-single-json-list-out-of-mappingjacksonjsonview/

それが役に立てば幸い!

于 2019-02-13T19:43:48.737 に答える
1

RequestMappingHandlerMapping.registerMapping()メソッドごとにリクエストマッピングを登録することが(現在)可能です。

例:

@Autowired
RequestMappingHandlerMapping requestMappingHandlerMapping;

public void register(MyController myController) throws Exception {
    RequestMappingInfo mappingInfo = RequestMappingInfo.paths("xxxx/info").methods(RequestMethod.GET).build();
    Method method = myController.getClass().getMethod("info");
    requestMappingHandlerMapping.registerMapping(mappingInfo, myController, method);
}


于 2020-05-10T09:53:06.570 に答える
0

RequestMappingHandlerMappingを拡張することにより、独自のHandlerMappingを登録できます。たとえば、をオーバーライドしますregisterHandlerMethod

于 2016-01-05T16:38:22.830 に答える
-5

何を達成しようとしているのかは明確ではありませんが、@RequestMappingで@PathVariableを使用できます。

@RequestMapping("/affId/{id}")
public void myMethod(@PathVariable("id") String id) {}

編集:元の例は表示が変更されていますが、とにかくPathVariableを使用できる可能性があります。

于 2013-03-19T13:28:45.563 に答える